7

次の例を使用して、誰かが集約と ddply の違いを理解するのを手伝ってくれますか?

データ フレーム:

mydat <- data.frame(first = rpois(10,10), second = rpois(10,10), 
                    third = rpois(10,10), group = c(rep("a",5),rep("b",5)))

集計を使用して、係数で分割されたデータ フレームの一部に関数を適用します。

aggregate(mydat[,1:3], by=list(mydat$group), mean)
  Group.1 first second third
1       a   8.8    8.8  10.2
2       b   6.8    9.4  13.4

別の関数に集計を使用してみてください (エラー メッセージが返されます)。

aggregate(mydat[,1:3], by=list(mydat$group), function(u) cor(u$first,u$second))
Error in u$second : $ operator is invalid for atomic vectors

次に、ddply (plyr パッケージ) で同じことを試してください。

ddply(mydat, .(group), function(u) cor(u$first,u$second))
  group         V1
1     a -0.5083042
2     b -0.6329968

すべてのヒント、リンク、批判は高く評価されます。

4

3 に答える 3

14

aggregate各列で FUN を個別に呼び出します。これが、独立した手段を取得する理由です。 ddplyすべての列を関数に渡します。何が渡されているかを簡単に説明aggregateすると、次のようになります。

デモンストレーション用のサンプルデータ:

d <- data.frame(a=1:4, b=5:8, c=c(1,1,2,2))

> d
  a b c
1 1 5 1
2 2 6 1
3 3 7 2
4 4 8 2

関数を使用し、コマンドまたはprintの結果を無視することで、各反復で関数に何が渡されるかを確認できます。aggregateddply

aggregate:

tmp <- aggregate(d[1:2], by=list(d$c), print)
[1] 1 2
[1] 3 4
[1] 5 6
[1] 7 8

個々の列が印刷のために送信されることに注意してください。

ddply:

tmp <- ddply(d, .(c), print)
  a b c
1 1 5 1
2 2 6 1
  a b c
3 3 7 2
4 4 8 2

データ フレームが印刷用に送信されていることに注意してください。

于 2013-01-05T22:02:06.383 に答える
8

引数として 2 つのベクトルを必要とする関数に {base} 関数を使用するのが間違っている理由はすでに説明されていaggregateますが、どの非 ddply アプローチが成功するかについてはまだ説明されていません。

by( ... grp, FUN)メソッド:

> cbind (by( mydat, mydat["group"], function(d) cor(d$first, d$second)) )
        [,1]
a  0.6529822
b -0.1964186

sapply(split( ..., grp), fn)方法_

> sapply(  split( mydat, mydat["group"]), function(d) cor(d$first, d$second)) 
         a          b 
 0.6529822 -0.1964186 
于 2013-01-05T22:23:14.007 に答える
6

@MatthewLundbergの答えは非常に良いです.私の答えではありませんが、R関数呼び出しの背後で何が起こるかを見たいときに使用する一般的なヒントです. debug コマンドを使用しbrowserます。

aggregate(mydat[,1:3], by=list(mydat$group), 
+           function(x){
+             browser()
+             mean(x)
+           })
Called from: FUN(X[[1L]], ...)
Browse[1]> x
[1] 16 10 16 13 25

次に、ddply

ddply(mydat, .(group), function(u) {
+   browser()
+   cor(u$first,u$second)
+   })
Called from: .fun(piece, ...)
Browse[1]> u
  first second third group
1    16      8     9     a
2    10      6     6     a
3    16      6    10     a
4    13      8    10     a
5    25     10     4     a

自分でエラーを編集してデバッグする

ここでは、この手法を使用して、エラーが発生する理由を確認します

aggregate(mydat[,1:3], by=list(mydat$group), function(u) {
+   browser()
+   cor(u$first,u$second)
+   })
Called from: FUN(X[[1L]], ...)
Browse[1]> u
[1] 16 10 16 13 25    

ここでわかるように、u は原子ベクトル (列名なし) です。

Browse[1]> u$first

エラーが発生します:

Error in u$first : $ operator is invalid for atomic vectors
于 2013-01-05T22:14:07.543 に答える