错误:找不到对象'...'

时间:2014-07-28 13:55:52

标签: r plyr

我正在尝试使用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)))

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帖子中的答案。