【发布时间】:2017-02-09 00:17:38
【问题描述】:
我可以通过反复“移动”我的数据,然后“逐行”汇总来实现滚动窗口,但这似乎很麻烦,并且不容易推广到不同的窗口大小。
#' 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
我假设有更好的方法。
【问题讨论】:
-
也许可以看看 zoo 和 RcppRoll 包中的各种
roll*函数。 -
@JoshO'Brien:抱歉,固定数据。我看过使用 zoo 和 RcppRoll 的帖子,但有点认为这应该在 data.table 中运行良好。
-
您的代码简化为
d[, do.call(pmax, c(shift(x, 0:2, type='lag'), na.rm=TRUE)), by=id],但我想这仍然不如 RcppRoll 之类的专用滚筒效率。 -
@Frank:谢谢 - 在下面实现了你的后一个建议
标签: r data.table