【问题标题】:applying rolling mean by group in R在R中按组应用滚动平均值
【发布时间】:2012-03-27 12:28:47
【问题描述】:

我是 R 新手,在做一些可能非常简单的事情时遇到了很多麻烦。我有一个按国家/地区代码分组的大型数据集,我想按国家/地区获取价格指数的 3 个月滚动平均值,然后将其放入与相应月份匹配的新列中。我一直在尝试像这样使用 rollmean,但没有成功(代码和错误消息如下):

> leader$last3<-tapply(leader, leader$ccode, 
    function(x) rollmean(leader$GI_delta, 3, na.pad=T))
Error in tapply(leader, leader$ccode, function(x) rollmean(leader$GI_delta,  : 
  arguments must have same length

> leader$last3<-ddply(leader, .(ccode), 
    rollmean(GI_delta, 3, na.pad=T))

Error in llply(.data = .data, .fun = .fun, ..., .progress = .progress,  : 
  .fun is not a function.

任何帮助将不胜感激!

【问题讨论】:

    标签: r moving-average


    【解决方案1】:

    在您的第一次尝试中,您的函数没有使用它的 x 参数, 并且总是返回相同的东西(大小错误的向量)。 另外,第一个参数,应该是一个向量。 最后,tapply 返回一个向量列表: 您不能将结果直接放入 data.frame。

    library(zoo)
    n <- 10
    leader <- data.frame(
      ccode = rep(LETTERS[1:3],each=n),
      GI_delta = rnorm(3*n)
    )
    tapply(
      leader$GI_delta, 
      leader$ccode, 
      function(x) rollmean(x, 3, na.pad=TRUE)
    )
    

    在您的第二个示例中,plyr 的第三个参数 应该是一个函数,而不是一个表达式。 如果要使用表达式,可以使用summarizetransform 作为一个函数(summarize 返回一个 1 行 data.frame 对于ccode 的每个值,而transform 保持行数不变), 并将表达式作为进一步的参数。

    library(plyr)
    ddply(
      leader, "ccode",
      transform,
      last3 = rollmean( GI_delta, 3, align="right", na.pad=TRUE )
    )
    

    【讨论】:

      【解决方案2】:

      如果您想创建一个新列,请尝试使用ave。它类似于tapply,但返回与其第一个参数长度相同的向量。我的经验是比ddply快很多:

      require(zoo)
      leader$last3<-ave(leader$GI_delta, leader$ccode, 
                               FUN= function(x) rollmean(x, k=3, na.pad=T) )
      

      【讨论】:

        猜你喜欢
        • 2014-11-29
        • 2019-09-22
        • 2015-01-18
        • 2017-10-25
        • 2023-03-29
        • 1970-01-01
        • 2019-09-24
        相关资源
        最近更新 更多