如何滚动应用多列数据 table
How to rollapply over a multi column data table
我想在多列数据表上使用 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
你快到了,可以做:
lapply(DT[,2:3], function(x) rollapply(x,width=3, FUN=mean))
#$y
#[1] 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333
#$v
#[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
我想在多列数据表上使用 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
你快到了,可以做:
lapply(DT[,2:3], function(x) rollapply(x,width=3, FUN=mean))
#$y
#[1] 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333 3.333333
#$v
#[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