在R中应用滚动平均值

时间:2012-03-10 06:42:41

标签: r moving-average

我是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.

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:5)

在您第一次尝试时,您的函数不使用其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 )
)