23

私は、さまざまな変数や関数を試し、結果を確認することで、plyr がどのように機能するかを理解しようと努めてきました。だから私は、それが答える特定の修正よりも、plyrがどのように機能するかの説明を探しています。ドキュメントを読みましたが、私の初心者の脳はまだそれを理解していません。

いくつかのデータと名前:

mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e")
                  ,c(1,2,3,10,20,30),
                  c(5,10,20,20,15,10))
colnames(mydf)<-c("Model", "Class","Length", "Speed")
mydf

質問 1: 構文の要約と変換

だから私が入力した場合:ddply(mydf, .(Model), summarise, sum = Length+Length)

私は得る:

`Model ..1
1     a   2
2     a   4
3     b   6
4     b  20
5     c  40
6     c  60

入力するとddply(mydf, .(Model), summarise, Length+Length)、同じ結果が得られます。

変換を使用する場合:ddply(mydf, .(Model), transform, sum = (Length+Length))

私は得る:

  Model Class Length Speed sum
1     a     e      1     5   2
2     a     e      2    10   4
3     b     e      3    20   6
4     b     e     10    20  20
5     c     e     20    15  40
6     c     e     30    10  60

しかし、最初の要約のように述べると: ddply(mydf, .(Model), transform, (Length+Length))

  Model Class Length Speed
1     a     e      1     5
2     a     e      2    10
3     b     e      3    20
4     b     e     10    20
5     c     e     20    15
6     c     e     30    10

では、なぜ「sum =」を追加すると違いが生じるのでしょうか?

質問 2: これらが機能しないのはなぜですか?

ddply(mydf, .(Model), sum, Length+Length)# 関数 (i) のエラー: オブジェクト '長さ' が見つかりません

ddply(mydf, .(Model), length, mydf$Length) #Error in .fun(piece, ...) : 

1 つを必要とする 'length' に 2 つの引数が渡されました

これらの例は、どこかで plyr の使い方を根本的に理解していないことを示しています。

アンサーや説明をいただければ幸いです。

4

3 に答える 3

22

R の機能ツールがどのように機能するかを「視覚化」するのに問題がある場合、最も簡単な方法は単一のインスタンスをブラウザーで表示することです。

ddply(mydf, .(Model), function(x) browser() )

x次に、リアルタイムで検査すると、すべてが理にかなっているはずです。次に、x で関数をテストし、それが機能する場合はゴールデンです (他のグループが最初の x と異なる場合を除きます)。

于 2012-07-07T11:05:38.560 に答える
19

構文は次のとおりです。

ddply(data.frame, variable(s), function, optional arguments)

ここで、関数はを返すことが期待されdata.frameます。あなたの状況では、

  • summaryは、新しいdata.frameを透過的に作成する関数であり、追加の引数として指定した式の結果を使用します(...)

  • 基本R関数であるtransformは、data.framesを変換し(最初に変数によって分割されます)、追加の引数として指定した式に従って新しい列を追加します。これらには名前を付ける必要があります。これは、変換が機能する方法です。

サブセット、変換、変更、with、within、またはsummarise以外の関数を使用する場合は、それらがdata.frameを返すか(長さと合計は返さない)、少なくとも適切なベクトルを返すようにする必要があります。出力の長さ。

于 2012-07-06T22:23:10.340 に答える
4

私が理解している操作は、グループ化変数ddply(... , .(...) , summarise, ...)内の個別の組み合わせの数に一致するように行の数を減らすように設計されています。.(...)したがって、最初の例では、これは自然に思えました。

ddply(mydf, .(Model), summarise, sL = sum(Length)
  Model sL
1     a  3
2     b 13
3     c 50

わかった。私にとってはうまくいくようです(通常のplyrユーザーではありません)。一方transform、操作は、データフレームと同じ長さの新しい列を作成していることを理解しています。それがあなたの最初のtransform電話で実現したことです。2 つ目 (失敗) は次のとおりです。

ddply(mydf, .(Model), transform, (Length+Length))

これは、実行された操作の新しい名前を作成しなかったため、結果に新しい名前は何も割り当てられませんでした。を追加するsum=(Length+Length)と、突然名前が利用可能になりました (そして、sum関数は使用されませんでした)。一般に、列名に関数名を使用することはお勧めできません。

質問 2 では、.fun 引数は古い関数ではなく、(分割された) データフレーム全体に適用される plyr 関数または意味のあるものである必要があると思います。機能はありませんsum.data.frame。しかし、「nrow」または「ncol」は理にかなっています。その位置で「str」を機能させることもできます。データフレームに適用される長さ関数は、列の数を示します。

 ddply(mydf, .(Model), length )  # all 4's
于 2012-07-06T22:34:24.213 に答える