我可以通过反复“移动”我的数据,然后“按行”汇总来实现滚动窗口,但这看起来很麻烦,而且不容易推广到不同的窗口大小。
#' Generate dummy data
library(data.table)
set.seed(42)
d <- data.table(id=rep(letters[1:2], each=5), time=rep(1:5,times=2), x=sample.int(10,10,replace=T))
数据如下所示:
id time x
a 1 10
a 2 10
a 3 3
a 4 9
a 5 7
b 1 6
b 2 8
b 3 2
b 4 7
b 5 8
现在对过去 2 次(对于每个 ID)进行滚动“最大值”。
#' Now you want to take the maximum of the previous 2 x values (by id)
#' I can do this by creating shifted lagged versions
d[, x.L1 := shift(x,1,type='lag'), by=id]
d[, x.L2 := shift(x,2,type='lag'), by=id]
d[, x.roll.max := max(x,x.L1,x.L2, na.rm=2), by=.(id,time)]
生成这个
id time x x.L1 x.L2 x.roll.max
a 1 10 NA NA 10
a 2 10 10 NA 10
a 3 3 10 10 10
a 4 9 3 10 10
a 5 7 9 3 9
b 1 6 NA NA 6
b 2 8 6 NA 8
b 3 2 8 6 8
b 4 7 2 8 8
b 5 8 7 2 8
我假设有更好的方法。
最佳答案
所以我按照上面@Franks 的建议去了 RcppRoll。
library(Rcpp)
d[, x.roll.max := roll_max(x, n=2L, align='right', fill=NA, na.rm=T), by=id]
而且我想我不应该尝试在 data.table b/c 中完成这一切,这非常有效。
id time x x.roll.max
a 1 11 NA
a 2 12 12
a 3 4 12
a 4 10 10
a 5 8 10
a 6 7 8
b 1 9 NA
b 2 2 9
b 3 8 8
b 4 9 9
b 5 6 9
b 6 9 9
关于r - 使用 data.table 实现滚动窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42126071/