TL; DR: Вместо этого используйте > constraint_matrix<-data.frame(row.names = format(time_index, usetz = TRUE))
.
Полная история:
Возможно, вы захотите спросить себя, почему эта конкретная дата возникла с ошибкой, сказав, что она была дубликатом (Работа с любой датой в это время года всегда вызывает у меня чувство легкомыслия!)
Конечно, в СШАчасы возвращаются в 02:00 3 ноября 2019 года ... поэтому 01:00 происходит дважды.
Мы можем увидеть это, если просто посмотрим на урезанную версию вашего time_index:
> seq(from = as.POSIXct("2019-11-02 23:00:00",tz = "US/Eastern"), to = as.POSIXct("2019-11-03 02:00:00",tz = "US/Eastern"), by = "hour")
[1] "2019-11-02 23:00:00 EDT" "2019-11-03 00:00:00 EDT" "2019-11-03 01:00:00 EDT" "2019-11-03 01:00:00 EST" "2019-11-03 02:00:00 EST"
Обратите внимание, как меняется часовой пояс между 3-м и 4-м результатом, и они оба во времени 01:00:00
Это вызывает проблему, когда вы устанавливаете row.names = time_index
, потому что row.names
ищет строки,R доблестно преобразует их в строки, но посмотрите, что происходит, когда он использует метод «по умолчанию»:
> format(as.POSIXlt("2019-11-03 23:00:00",tz = "US/Eastern"))
[1] "2019-11-03 23:00:00"
Мы потеряли наш код часового пояса, поэтому теперь оба экземпляра 01:00:00
имеют абсолютно одинаковую строкуследовательно, повторяющаяся ошибка при попытке использовать их как имена строк!
Создание поля rownames
во фрейме данных определенно решает проблему (kudos @ sindri-baldur), но у вас может быть скрытая проблемажду, чтобы укусить вас позже, потому что у вас все еще есть повторяющееся значение в вашем поле rownames
. Дело в том, что R, понятно, не заботится о повторяющихся значениях в реальных данных, как в row.names
, поэтому не выдает ошибку.
Это зависит от того, что вы делаете с данными, независимо от того,заботиться или нет - может быть, это не имеет значения, что две строки имеют одинаковую метку, и в этом случае трескается, но может случиться так, что некоторые результаты вашего анализа сейчас или в будущем обнаруживают неправильные значения или временные шкалы выглядят какнемного странно примерно в это время.
Вы можете сделать, как хотели, и создать правильный row.names
, но попросите R включить часовой пояс в способ форматирования строки, используя необязательный параметр usetz
, например так:
> constraint_matrix<-data.frame(row.names = format(time_index, usetz = TRUE))