Добавить второй дублируются даты 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 4

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 (не проверено на ваших данных).