我正在尝试在其中使用 ddply 制作一个函数。但是我无法上班。这是一个复制我得到的虚拟示例。这和这个bug有什么关系吗?
library(ggplot2)
data(diamonds)
foo <- function(data, fac1, fac2, bar) {
res <- ddply(data, .(fac1, fac2), mean(bar))
res
}
foo(diamonds, "color", "cut", "price")
您的代码有很多问题,但主要问题是:您将列名作为字符串传递。
只需在函数中使用您的参数进行“查找和替换”即可:
res <- ddply(diamonds, .("color", "cut"), mean("price"))
如果您了解其ddply
工作原理(鉴于其余代码,我对此表示怀疑),您将理解这不应该起作用:忽略最后一部分(函数)中的错误,这应该是(注意缺少引号:.() 符号只不过是 plyr 提供引号的方式):
res <- ddply(diamonds, .(color, cut), mean(price))
幸运的是,ddply
它还支持将其第二个参数作为字符向量传递,即列名,因此(再次忽略最后一个参数的问题),这应该变成:
foo <- function(data, facs, bar) {
res <- ddply(data, facs, mean(bar))
res
}
foo(diamonds, c("color", "cut"), "price")
最后:你传递给ddply
的函数应该是一个函数,它的第一个参数是 data.frame,它每次都会保存你传递的部分 data.frame(菱形),用于 和 的当前color
值cut
。mean("price")
或者mean(price)
两者都不是。如果您坚持使用ddply
,请执行以下操作:
foo <- function(data, facs, bar) {
res <- ddply(data, facs, function(dfr, colnm){mean(dfr[,colnm])}, bar)
res
}
foo(diamonds, c("color", "cut"), "price")
我不相信这是一个错误。ddply
需要一个函数的名称,但您并没有真正提供mean(bar)
. 您需要编写一个完整的函数来计算您想要的平均值:
foo <- function(data, fac1, fac2, bar) {
res <- ddply(data, c(fac1, fac2), function(x,ind){
mean(x[,ind]},bar)
res
}
另外,您不应该将字符串传递给.()
,所以我将其更改为c()
,以便您可以将函数参数直接传递给ddply
.