web-dev-qa-db-ja.com

Plyr、Ddplyを理解することを学ぶ

私は、さまざまな変数や関数を試し、その結果を確認することで、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)のエラー:オブジェクト 'Length'が見つかりません

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

1を必要とする「長さ」に渡される2つの引数

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

Anwserまたは説明をいただければ幸いです。

22
rsgmon

構文は次のとおりです。

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

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

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

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

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

19
baptiste

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

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

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

22
Ari B. Friedman

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

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

OK。私のために働くようです(通常のplyrユーザーではありません)。一方、transform操作は、データフレームと同じ長さの新しい列を作成することを理解しています。これが、最初のtransform呼び出しで実現したものです。 2番目の問題(失敗)は次のとおりです。

_ddply(mydf, .(Model), transform, (Length+Length))
_

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

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

_ ddply(mydf, .(Model), length )  # all 4's
_
4
42-