R - Копировать таблицу данных и создать последовательные даты - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть следующая таблица данных:

dt <- data.table(date=c(seq.Date(as.Date("2000-01-01"),as.Date("2000-01-03"),"1 day")),
                 a=c(1,2,3),
                 b=c(1,2,3),
                 c=c(1,2,3))
> dt
         date a b c
1: 2000-01-01 1 1 1
2: 2000-01-02 2 2 2
3: 2000-01-03 3 3 3

, и мне нужно повторить ее n раза (код взят из Повторить data.frame N раз ):

n <- 3
dt.rep <- dt[rep(seq_len(nrow(dt)), n)]

> dt.rep
         date a b c
1: 2000-01-01 1 1 1
2: 2000-01-02 2 2 2
3: 2000-01-03 3 3 3
4: 2000-01-01 1 1 1
5: 2000-01-02 2 2 2
6: 2000-01-03 3 3 3
7: 2000-01-01 1 1 1
8: 2000-01-02 2 2 2
9: 2000-01-03 3 3 3

Однако мне нужно, чтобы столбец date был последовательным.Последняя строка будет фактической последней датой, и мне нужно, чтобы она вернулась назад к первой строке, поэтому ожидаемый результат:

         date a b c
1: 1999-12-26 1 1 1
2: 1999-12-27 2 2 2
3: 1999-12-28 3 3 3
4: 1999-12-29 1 1 1
5: 1999-12-30 2 2 2
6: 1999-12-31 3 3 3
7: 2000-01-01 1 1 1
8: 2000-01-02 2 2 2
9: 2000-01-03 3 3 3

Как этого добиться?

РЕДАКТИРОВАТЬ:

Предлагаемое решение не подходит для больших почасовых наборов данных.Рассмотрим новый пример:

dt <- data.table(date=seq(as.POSIXct("1994-01-01 00:00:00"), as.POSIXct("2008-12-31 23:00:00"), by="1 hour"), temp=runif(n=131496, min=10, max=35)) 
> dt
                       date     temp
     1: 1994-01-01 00:00:00 26.40286
     2: 1994-01-01 01:00:00 21.37171
     3: 1994-01-01 02:00:00 16.11227
     4: 1994-01-01 03:00:00 30.28062
     5: 1994-01-01 04:00:00 25.22336
    ---                             
131492: 2008-12-31 19:00:00 18.43148
131493: 2008-12-31 20:00:00 24.10905
131494: 2008-12-31 21:00:00 10.33235
131495: 2008-12-31 22:00:00 27.73049
131496: 2008-12-31 23:00:00 21.74835

При его репликации 5 раз мы получим следующее:

n <- 5
dt[rep(seq_len(.N), n)][, newdate:=rev(seq(last(date),
                                           length.out=.N, by='-1 hour'))][]
                       date     temp             newdate
     1: 1994-01-01 00:00:00 26.40286 1933-12-31 00:00:00
     2: 1994-01-01 01:00:00 21.37171 1933-12-31 01:00:00
     3: 1994-01-01 02:00:00 16.11227 1933-12-31 02:00:00
     4: 1994-01-01 03:00:00 30.28062 1933-12-31 03:00:00
     5: 1994-01-01 04:00:00 25.22336 1933-12-31 04:00:00
    ---                                                 
657476: 2008-12-31 19:00:00 18.43148 2008-12-31 19:00:00
657477: 2008-12-31 20:00:00 24.10905 2008-12-31 20:00:00
657478: 2008-12-31 21:00:00 10.33235 2008-12-31 21:00:00
657479: 2008-12-31 22:00:00 27.73049 2008-12-31 22:00:00
657480: 2008-12-31 23:00:00 21.74835 2008-12-31 23:00:00

Обратите внимание, как отсутствуют столбцы date и newdateсинхронизацииЯ ожидал бы, что newdate начнется с 1934-01-01 00:00:00, а скорее с 1933-12-31 00:00:00.Это приводит к тому, что таблица данных имеет 76 (length(unique(year(dt$newdate)))) лет данных, а не 5 повторений 15 years в исходном = 75 лет.Я не уверен, что здесь происходит ...

1 Ответ

0 голосов
/ 02 февраля 2019

После шага связывания rep, используя last 'date', получите rev erse seq вхождения даты, указав length.out как .N (количество строк и by как отрицательный 1 день

dt[rep(seq_len(.N), n)][, date := rev(seq(last(date),
       length.out = .N, by = '-1 day'))][]
#         date a b c
#1: 1999-12-26 1 1 1
#2: 1999-12-27 2 2 2
#3: 1999-12-28 3 3 3
#4: 1999-12-29 1 1 1
#5: 1999-12-30 2 2 2
#6: 1999-12-31 3 3 3
#7: 2000-01-01 1 1 1
#8: 2000-01-02 2 2 2
#9: 2000-01-03 3 3 3

Обновление

Исходя из комментариев ОП, представляется, что последовательность 'date' должна быть rev сброшена для каждой репликации. В этом случаемы можем использовать rep в качестве группирующей переменной

n <- 5
dt[rep(seq_len(.N), n)][, newdate := rev(seq(last(date),
   length.out = .N, by='-1 hour')), by = .(rep(seq_len(n), each = nrow(dt)))][]
#                  date     temp             newdate
#1: 1994-01-01 00:00:00 34.19615 1994-01-01 00:00:00
#2: 1994-01-01 01:00:00 34.29310 1994-01-01 01:00:00
# ...

ПРИМЕЧАНИЕ. Использование обновленных данных в посте ОП

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...