【问题标题】:How to rollapply over a multi column data table如何滚动应用多列数据表
【发布时间】:2015-10-27 10:35:32
【问题描述】:

我想在多列数据表上使用 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

【问题讨论】:

    标签: r data.table rollapply


    【解决方案1】:

    仅使用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
    

    【讨论】:

    • 我猜你可以使用roll_mean from library(RcppRoll)
    • @akrun 我想到了,但只想显示data.table 答案:)。我想您可以单独添加或编辑上校答案
    • 您可以编辑其中一个答案或提出您的答案,我并不介意。但是很好的建议 ;) 并且 +1 用于减少和转移,即使它有点过分!
    • @ColonelBeauvel 我认为这并不过分,我猜它比zoo::rollapply 大数据集要快得多。但RcppRoll::roll_mean 可能是最快的。
    • @blackknight316 请阅读this。一切都在那里解释。
    【解决方案2】:

    你快到了,可以做:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-30
      • 2015-08-21
      • 2021-07-04
      • 1970-01-01
      • 2020-06-29
      • 2021-02-09
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多