r - 使用 data.table 实现滚动窗口

标签 r data.table

我可以通过反复“移动”我的数据,然后“按行”汇总来实现滚动窗口,但这看起来很麻烦,而且不容易推广到不同的窗口大小。

#' 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/

相关文章:

r - `spread= a - b` 用 `dplyr` 和 `data.table` 计算 tall 数据

r - nrow>100时data.table打印错误

r - 如何将大量模型传递给gather_predictions

r - 如何在 data.table 列中放置不同大小的向量

c# - 是否可以使用 C# 中定义的对象作为使用 R.NET 的 R 函数/命令的输入

r - Hmisc 使用 rowname = NULL 分隔列标题

r - As.character 返回数字而不是字符串 R

删除 data.table 中的所有重复项,添加带有标识符列表的列

R 指定时间戳差异的单位

r bookdown pdf 格式不起作用