我正在尝试使用ddply来创建一个函数。但是我不能上班。这是一个复制我得到的虚拟例子。这有什么事要做this bug吗?
library(ggplot2)
data(diamonds)
foo <- function(data, fac1, fac2, bar) {
res <- ddply(data, .(fac1, fac2), mean(bar))
res
}
foo(diamonds, "color", "cut", "price")
答案 0 :(得分:10)
我不相信这是一个错误。 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
。
答案 1 :(得分:10)
您的代码存在很多问题,但主要问题是:您将列名称作为字符串传递。
在函数中使用参数进行'查找和替换'只会产生:
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")