首页 文章

在函数内部使用ddply

提问于
浏览
5

我开始工作了.2353908这是一个复制我得到的虚拟例子 . 这有什么事吗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 回答

  • 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 .

  • 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")
    

相关问题