【问题标题】:Consecutive independent means (not using sliding window) in RR中的连续独立方式(不使用滑动窗口)
【发布时间】:2012-12-30 23:24:44
【问题描述】:

我想计算类似于滚动平均值或移动平均值的东西,但不通过滑动窗口这样做。例如,对于以下一组数字,我希望在 5 组下方显示平均值:

 1,2,3,4,5,1,2,4,5,6,7,8,1,2,3,1,1,3,2,1    
|    3    |   3.6   |   4.2   |   1.6   |  //mean of every 5 numbers

我知道 TTR 库中的 movingAveragesrollmean 函数都使用滑动窗口,因此执行以下操作相当简单:

d <- c(1,2,3,4,5,1,2,4,5,6,7,8,1,2,3,1,1,3,2,1)
m <- rollmean(d,5)
m[seq(1,length(m),5)]
> [1] 3.0 3.6 4.2 1.6

但是我有一个大型数据集,必须有一种更有效的方法来计算它......有什么想法吗?我假设有一个函数可以做到这一点,但我想不出这种平均值叫什么。

【问题讨论】:

    标签: r moving-average


    【解决方案1】:

    如果我理解正确,你可以这样做:

    x <- c(1,2,3,4,5,1,2,4,5,6,7,8,1,2,3,1,1,3,2,1)
    
    colMeans(matrix(x, nrow=5))
    3.0 3.6 4.2 1.6
    

    这是做什么的:

    • 将数据转换为矩阵
    • 取列方式

    由于这是对向量的单个操作(矩阵本身就是向量),因此速度应该非常快。例如,对于 1000 万个元素的向量:

    x <- runif(1e7)
    system.time(colMeans(matrix(x, nrow=5)))
       user  system elapsed 
       0.05    0.02    0.07 
    

    【讨论】:

    • 我正要编辑它,但你先抓住了它。很好的解决方案。
    • 看起来不错,没想到,干杯。如果,例如length(x) %% 5 != 0 我还想说最后一个锯齿状的山口?
    【解决方案2】:

    只是为了好玩,这里是你可以用tapply做到这一点的方法

    tapply(x, rep(seq(length(x)/5),each=5), mean)
    ##   1   2   3   4 
    ## 3.0 3.6 4.2 1.6 
    

    这很容易适用于长度不能被 5 整除的向量:

    x <- c(x, 2)
    tapply(x, head(rep(seq(ceiling(length(x)/5)), each=5),length(x)), mean)
    ##   1   2   3   4   5 
    ## 3.0 3.6 4.2 1.6 2.0 
    

    【讨论】:

      猜你喜欢
      • 2020-11-11
      • 1970-01-01
      • 2013-04-03
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2012-07-25
      相关资源
      最近更新 更多