5

内部でddplyを使用して関数を作成しようとしています。しかし、私は仕事をすることができません。これは私が得たものを再現したダミーの例です。これはこのバグを行うために何かありますか?

library(ggplot2)
data(diamonds)

foo <- function(data, fac1, fac2, bar) {
  res <- ddply(data, .(fac1, fac2), mean(bar))
  res
}

foo(diamonds, "color", "cut", "price")
4

2 に答える 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

于 2011-07-05T14:34:30.467 に答える
10

コードにはかなりの問題がありますが、主な問題は、列名を文字列として渡すことです。

関数内のパラメーターで「検索と置換」を実行するだけで、次のようになります。

res <- ddply(diamonds, .("color", "cut"), mean("price"))

どのように機能するかを理解している場合ddply(コードの残りの部分を考えると、これは疑わしいです)、これは機能しないはずです:最後の部分(関数)のエラーを無視すると、これは(不足に注意してください)引用符の:。()表記は、引用符を提供するplyrの方法にすぎません):

res <- ddply(diamonds, .(color, cut), mean(price))

幸いなことに、ddply2番目の引数を文字のベクトル、つまり列の名前として渡すこともサポートしているため、(最後のパラメーターの問題をもう一度無視すると)次のようになります。

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

foo(diamonds, c("color", "cut"), "price")

最後に、渡すddply関数は、最初の引数としてdata.frameを受け取る関数である必要があります。この関数は、およびの現在の値について、data.frame(ひし形)に渡される部分を毎回保持しcolorますcutmean("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")
于 2011-07-05T14:41:29.053 に答える