我可以通过反复转移'来实现滚动窗口。我的数据,然后总结' row-wise',但这似乎很麻烦,不容易推广到不同的窗口大小。
#' 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
现在采取滚动的最大值&#39;在过去的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
我假设有更好的方法。
答案 0 :(得分:2)
所以我按照上面的@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
答案 1 :(得分:0)
我喜欢Ulrich的TTR套餐。下面给出了最大运行
TTR::runMax(d$x,2)
答案 2 :(得分:0)
从data.table v1.12.4(2019年10月3日)开始,用于滚动计算任意R函数的函数frollapply
可用:
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))
d[, x.roll.max := frollapply(x = x, n = 2, max, fill = NA, align = "right", na.rm = TRUE), by = id]
id time x x.roll.max
1: a 1 1 NA
2: a 2 5 5
3: a 3 1 5
4: a 4 9 9
5: a 5 10 10
6: b 1 4 NA
7: b 2 2 4
8: b 3 10 10
9: b 4 1 10
10: b 5 8 8