Подвижные соединения: свертывание вперед и назад

data.table - это потрясающе, потому что я могу делать скользящие соединения и даже делать катящиеся соединения внутри групп!

library(data.table)
set.seed(42)
metrics <- data.frame(
  ID=c(rep(1, 10), rep(2,5), rep(3,5)),
  Time=c(1:10, 4:8, 8:12),
  val1=runif(20),
  val2=runif(20),
  val3=runif(20),
  val4=runif(20)
  )
metrics <- data.table(metrics[sample(1:nrow(metrics), 15),], key=c('ID', 'Time'))
calendar <- data.table(expand.grid(ID=1:3, Time=1:12), key=c('ID', 'Time'))

metrics[calendar,roll=TRUE]

Впрочем, для меня это не удивительно. У этого data.table все еще есть NA:

> metrics[calendar,roll=TRUE]
    ID Time      val1      val2      val3        val4
 1:  1    1 0.9148060 0.9040314 0.3795592 0.675607275
 2:  1    2 0.9370754 0.1387102 0.4357716 0.982817198
 3:  1    3 0.9370754 0.1387102 0.4357716 0.982817198
 4:  1    4 0.8304476 0.9466682 0.9735399 0.566488424
 5:  1    5 0.8304476 0.9466682 0.9735399 0.566488424
 6:  1    6 0.5190959 0.5142118 0.9575766 0.189473935
 7:  1    7 0.7365883 0.3902035 0.8877549 0.271286615
 8:  1    8 0.7365883 0.3902035 0.8877549 0.271286615
 9:  1    9 0.6569923 0.4469696 0.9709666 0.693204820
10:  1   10 0.7050648 0.8360043 0.6188382 0.240544740
11:  1   11 0.7050648 0.8360043 0.6188382 0.240544740
12:  1   12 0.7050648 0.8360043 0.6188382 0.240544740
13:  2    1        NA        NA        NA          NA
14:  2    2        NA        NA        NA          NA
15:  2    3        NA        NA        NA          NA
16:  2    4 0.4577418 0.7375956 0.3334272 0.042988796
17:  2    5 0.7191123 0.8110551 0.3467482 0.140479094
18:  2    6 0.9346722 0.3881083 0.3984854 0.216385415
19:  2    7 0.2554288 0.6851697 0.7846928 0.479398564
20:  2    8 0.2554288 0.6851697 0.7846928 0.479398564
21:  2    9 0.2554288 0.6851697 0.7846928 0.479398564
22:  2   10 0.2554288 0.6851697 0.7846928 0.479398564
23:  2   11 0.2554288 0.6851697 0.7846928 0.479398564
24:  2   12 0.2554288 0.6851697 0.7846928 0.479398564
25:  3    1        NA        NA        NA          NA
26:  3    2        NA        NA        NA          NA
27:  3    3        NA        NA        NA          NA
28:  3    4        NA        NA        NA          NA
29:  3    5        NA        NA        NA          NA
30:  3    6        NA        NA        NA          NA
31:  3    7        NA        NA        NA          NA
32:  3    8 0.9400145 0.8329161 0.7487954 0.719355838
33:  3    9 0.9400145 0.8329161 0.7487954 0.719355838
34:  3   10 0.1174874 0.2076590 0.1712643 0.375489965
35:  3   11 0.4749971 0.9066014 0.2610880 0.514407708
36:  3   12 0.5603327 0.6117786 0.5144129 0.001570554
    ID Time      val1      val2      val3        val4

Я мог бы заполнить эти NA, используя zoo:::na.locf, fromLast=TRUE, но это не очень весело. Может ли кто-нибудь подумать об элегантном способе, которым я могу перевернуть NA назад (после их перемотки вперед), во время соединения data.table?

Ответы

Ответ 1

Это возможно в data.table версия 1.8.8 выпущена в марте 2013 года:

metrics[calendar, roll=TRUE, rollends=c(TRUE, TRUE)]

Из data.table НОВОСТИ файл:

В дополнение к TRUE/FALSE, "roll" теперь может быть положительным числом (roll forward/LOCF) или         отрицательное число (откат назад /NOCB ). Конечное число ограничивает расстояние, равное значению         (ограниченная постоянство). roll = TRUE и roll = + Inf эквивалентны.          "rollends" - это новый параметр, содержащий две логики. Первое наблюдение свернуто         назад, если первое значение роликов TRUE. Последнее наблюдение свернуто вперед, если второе значение валиков         правда. Если рулон - конечное число, тот же предел применяется к концам.         Новое значение roll = 'ближайшее' присоединяется к ближайшему значению (либо назад, либо вперед), когда         значение падает в промежутке и до конечного значения в соответствии с "rollends".          "rolltolast" устарел. Для обратной совместимости он преобразуется в         {Рулонной = TRUE; rollends = с (FALSE, FALSE)}.

Как всегда, чтобы загрузить самую последнюю версию data.table, см. Installation.

Ответ 2

metrics[calendar, roll = TRUE, rollends = c(TRUE, TRUE)]