在函数内部使用ddply

Luc*_*zer 5 r plyr

我正在尝试使用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")
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 10

我不相信这是一个错误.ddply期望你没有真正提供的函数的名称mean(bar).你需要编写一个完整的函数来计算你想要的平均值:

foo <- function(data, fac1, fac2, bar) {
  res <- ddply(data, c(fac1, fac2), function(x,ind){
                                     mean(x[,ind]},bar)
  res
}
Run Code Online (Sandbox Code Playgroud)

此外,您不应该将字符串传递给.(),因此我将其更改为c(),以便您可以直接将函数参数传递给ddply.


Nic*_*bbe 10

您的代码存在很多问题,但主要问题是:您将列名称作为字符串传递.

只需在函数内对参数进行"查找和替换"即可:

res <- ddply(diamonds, .("color", "cut"), mean("price"))
Run Code Online (Sandbox Code Playgroud)

如果你理解了它是如何ddply工作的(我有点怀疑这个,给出其余的代码),你会明白这不应该工作:忽略最后一部分(函数)中的错误,这应该是(注意缺乏引号:.()表示法只不过是plyr提供引号的方式:

res <- ddply(diamonds, .(color, cut), mean(price))
Run Code Online (Sandbox Code Playgroud)

幸运的是,ddply还支持将其第二个参数作为字符向量传递,即列的名称,因此(再次忽略最后一个参数的问题),这应该变为:

foo <- function(data, facs, bar) {
  res <- ddply(data, facs, mean(bar))
  res
}

foo(diamonds, c("color", "cut"), "price")
Run Code Online (Sandbox Code Playgroud)

最后:你传递给的函数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")
Run Code Online (Sandbox Code Playgroud)