r - 如何滚动应用多列数据表

标签 r data.table rollapply

我想在多列数据表上使用 rollapply 函数,即我希望能够独立使用每一列,例如让我们考虑以下数据表:

> DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
> DT
   x y v
1: a 1 1
2: a 3 2
3: a 6 3
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9

然后我想使用 rollapply 作为滚动子集,以便计算出第 2 列和第 3 列的 3 个元素的滚动平均值,并将它们存储到外部变量中:

> r1= NA; r2 = NA
> ft=function(x) { r1=mean(x[,2,with=FALSE]) ; r2=mean(x[,3,with=FALSE]) }
> rollapply(DT, width=3, ft)
 Error in x[, 2, with = FALSE] : incorrect number of dimensions 

除了我遇到这个不方便的错误之外,为什么它不起作用?

输出将是:

> r1
[1] 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333
> r2
[1] 2 3 4 5 6 7 8

最佳答案

仅使用 data.table 添加另一个选项

library(data.table) # v1.9.6+

定义滚动平均函数

rollMean <- function(x, n) Reduce(`+`, shift(x, 0L:(n - 1L)))/n

在指定 .SDcols 的同时将其应用于多列

DT[, lapply(.SD, rollMean, 3L), .SDcols = y:v]
#           y  v
# 1:       NA NA
# 2:       NA NA
# 3: 3.333333  2
# 4: 3.333333  3
# 5: 3.333333  4
# 6: 3.333333  5
# 7: 3.333333  6
# 8: 3.333333  7
# 9: 3.333333  8

关于r - 如何滚动应用多列数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33365611/

相关文章:

R Shiny : Subset data based on checkboxgroupinput

r - 通过使用 tidyverse 改变参数来调用相同的函数并应用族函数

rollapply:修复每个滑动窗口中的起始观察?

r - 利用回收将不同长度的列表转换为数据帧的功能

r - 根据另一个数据框在 R 数据框中创建变量

在 Shiny R Studio 中重置动画

r - 检查日期是否在查找表范围内

r - 使用 'shift' 中的序列和条件

r - 每组过去窗口大小日期的总和

使用sparklyr滚动处理大数据