在R中按组应用滚动平均值

11

我是一个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个回答

14
如果您想创建一个新的列,可以尝试使用ave。它类似于tapply,但会返回与第一个参数相同长度的向量。我的经验是,它比ddply快得多:
require(zoo)
leader$last3<-ave(leader$GI_delta, leader$ccode, 
                         FUN= function(x) rollmean(x, k=3, na.pad=T) )

5

在第一次尝试中,您的函数没有使用其x参数,并始终返回相同的内容(一个尺寸不正确的向量)。此外,第一个参数应该是一个向量。最后,tapply返回一个向量列表:您不能直接将结果放入数据框中。

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 返回每个 ccode 值的一行数据框,而 transform 保持行数不变),并将表达式作为进一步的参数。
library(plyr)
ddply(
  leader, "ccode",
  transform,
  last3 = rollmean( GI_delta, 3, align="right", na.pad=TRUE )
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接