2013-04-08 32 views
15

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仍然有来港:

> 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.locffromLast=TRUE,但是这不是很好玩。任何人都可以想到一个优雅的方式,我可以滚动NA的落后(在向前滚动之后),在data.table加入期间?

回答

20

这是可能的data.table 1.8.8版2​​013年3月发布:

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

data.table NEWS file

除了TRUE/FALSE, '滚' 现在可能是一个正数(向前滚动/ LOCF)或负数(向后滚动/ NOCB)。有限数字限制了滚动的值(有限的陈旧度)值 。 roll = TRUE和roll = + Inf是等价的。 'rollends'是一个包含两个逻辑的新参数。如果滚动的第一个值为TRUE,则第一个观测值向后滚动 。如果滚动 的第二个值为TRUE,则最后一个观察值会前滚。如果roll是有限数字,则相同的限制适用于末端。 当 值落入间隙中时,新值滚动='最接近'加入最接近的值(向后或向前),并根据'滚动'加至最终值。 'rolltolast'已被弃用。为了向后兼容,它被转换为 {roll = TRUE; rollends = c(FALSE,FALSE)}。

与往常一样,下载最先进的最新版本的data.table,看到Installation

+0

太棒了!哈哈哈,那真棒。 – Zach 2013-04-08 22:28:45

+0

+1我刚刚学到了很棒的东西!谢谢 – 2013-04-08 23:39:39

+0

我无法理解这一点“如果rollends1为TRUE,则第一个观察结果会向后滚动”。这是否意味着如果roll = + Inf,它将加入值LESS THAN以下 – eamo 2013-10-30 22:46:36

7

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