Добавить второй дублируются даты POSIXct
Я пытаюсь добавить отдельные секунды к любым повторяющимся датам в моем фрейме данных.
То есть из этого:
value date
18 2013-07-09 16:49:23
62 2013-07-09 18:01:36
64 2013-07-09 18:46:51
29 2013-07-09 18:46:51
22 2013-07-09 18:46:51
....
Я хотел бы получить следующее:
value date
18 2013-07-09 16:49:23
62 2013-07-09 18:01:36
64 2013-07-09 18:46:51
29 2013-07-09 18:46:52
22 2013-07-09 18:46:53
....
Я понимаю, что могу просто добавить + 1 или +2 к формату POSIXct, чтобы добавить секунды - однако я не знаю, как выбрать дубликаты. Обратите внимание, что мой фрейм данных имеет длину в несколько сотен строк, и дата может появляться до 20 раз подряд.
Я думаю сделать что-то в этом роде:
for (item in duplicated(dataframe$date)) {
if (item == TRUE) {
for (n in 1:#length of duplicated dates) {
dataframe[index(item) +n]$date <- (dataframe[index(item) +n]$date +n)
} } }
Спасибо за вашу помощь!
2 ответа:
Вы можете использовать
make.index.unique
в пакете xts.x <- structure(list(value = c(18, 62, 64, 29, 22), date = structure(c(1373406563, 1373410896, 1373413611, 1373413611, 1373413611), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("value", "date"), row.names = c(NA, -5L), class = "data.frame") x$date.unique <- make.index.unique(x$date,1) x # value date date.unique # 1 18 2013-07-09 16:49:23 2013-07-09 16:49:23 # 2 62 2013-07-09 18:01:36 2013-07-09 18:01:36 # 3 64 2013-07-09 18:46:51 2013-07-09 18:46:51 # 4 29 2013-07-09 18:46:51 2013-07-09 18:46:52 # 5 22 2013-07-09 18:46:51 2013-07-09 18:46:53
Вы можете попробовать использовать
rle
для подсчета длины пробегов одинаковых дат. Затем используйте длины повторов вместе сsequence
, чтобы вычислить количество секунд, которое вам нужно добавить.r <- rle(as.numeric(df$date))$lengths r # [1] 1 1 3 to.add <- sequence(r) - 1 to.add # [1] 0 0 0 1 2 df$date2 <- df$date + to.add # Suggestion from @agstudy to make it more general: df$date2 <- df$date + as.difftime(to.add, unit = "secs") df[ , c("date", "date2")] # date date2 # 1 2013-07-09 16:49:23 2013-07-09 16:49:23 # 2 2013-07-09 18:01:36 2013-07-09 18:01:36 # 3 2013-07-09 18:46:51 2013-07-09 18:46:51 # 4 2013-07-09 18:46:51 2013-07-09 18:46:52 # 5 2013-07-09 18:46:51 2013-07-09 18:46:53
Вы также можете посмотреть на некоторый пример фиксации дублирующего индекса времени в
?zoo
(не проверено на ваших данных).