在函数内部使用ddply

时间:2011-07-05 14:09:52

标签: r plyr

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

2 个答案:

答案 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(菱形)的部分colorcut的值。 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")