我是一个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.
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激!
42-*_*42- 13
如果要创建新列,请尝试使用 ave
.它类似tapply
但返回与第一个参数长度相同的向量.我的经验是它比ddply
以下快得多:
require(zoo)
leader$last3<-ave(leader$GI_delta, leader$ccode,
FUN= function(x) rollmean(x, k=3, na.pad=T) )
Run Code Online (Sandbox Code Playgroud)
在您的第一次尝试中,您的函数不使用其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)
)
Run Code Online (Sandbox Code Playgroud)
在第二个例子中,第三个参数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 )
)
Run Code Online (Sandbox Code Playgroud)