Дублировать строки при создании последовательности строк - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать последовательность строк, как показано ниже:

time_index <-seq(from = as.POSIXct("2019-10-21 06:00:00",tz = "US/Eastern"), 
                 to = as.POSIXct("2019-12-31 00:00:00",tz = "US/Eastern"), by = "hour")

constraint_matrix<-data.frame(row.names = time_index)

Но отображается ошибка ниже:

Error in data.frame(row.names = row) : 
   duplicate row.names: 2019-11-03 01:00:00

1 Ответ

0 голосов
/ 25 октября 2019

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...