我正在尝试使用ddply包编写函数。我已经阅读了几个解决方案,但我无法弄清楚如何解决这个问题。
Rolling <- function(ID, RP){
require(plyr)
cn=colnames(ID)
Rolling3M=ddply(ID, cn[2:(length(cn)-1)], transform, Rolling3M = as.numeric(filter(v3,c(1,rep(1,times=RP)),sides=1)))
return(Rolling3M)
}
v1=c("a","a","a","a","a","a","a","b","b","b","b","b","b")
v2=c("c","c","c","d","d","d","d","c","c","c","d","d","d")
v3=c(1:13)
df = data.frame(v1,v2,v3)
output=Rolling(df, 3)
我收到此错误消息:Error: object 'RP' not found
我想做同样的事情:
output=ddply(df, .(v1,v2),transform, Rolling3M=as.numeric(filter(v3,c(1,rep(1,2)), sides=1)))
答案 0 :(得分:0)
您是否看过这个问题:Object not found error with ddply inside a function
看起来这是基于ddply函数的变量范围的问题。如果你想了解更多关于它的细节,可以从Hadley(plyr包的作者)获得更多关于它的信息here。似乎解决这个问题是有问题的。
上面SO线程中评分最高的答案使用do.call
来解决环境范围问题,使用它来调用ddply。对于您的示例,这会将函数更改为:
Rolling <- function(ID, RP){
require(plyr)
cn <- colnames(ID)
Rolling3M <- do.call("ddply",list(ID, cn[2:(length(cn)-1)], transform, Rolling3M <- as.numeric(filter(c,c(1,rep(1,times = RP)),sides=1))))
return(Rolling3M)
}
给出了输出:
a b c
1 1 0 5
2 2 0 6
3 3 1 7
4 4 1 8
您对该功能的期望输出是什么?你没有在你的问题中说。
感谢James在上面链接的SO帖子中的答案。