在R中按组应用滚动平均值
Posted
技术标签:
【中文标题】在R中按组应用滚动平均值【英文标题】:applying rolling mean by group in 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.
任何帮助将不胜感激!
【问题讨论】:
【参考方案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
的第三个参数
应该是一个函数,而不是一个表达式。
如果要使用表达式,可以使用summarize
或 transform
作为一个函数(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) )
【讨论】:
以上是关于在R中按组应用滚动平均值的主要内容,如果未能解决你的问题,请参考以下文章