2012-07-06 14 views
21

私は、plyrがさまざまな変数や関数を試して何がどのように働いているかを理解しようとしています。ですから、私はplyrがどのように動作するかについての解答を特定の修正よりももっと探しています。私はドキュメントを読んだが、初心者の脳はまだそれを取得していない。plyrを理解することを学ぶ、ddply

一部のデータと名前:

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 

とI場合次のように入力します。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 

なぜ=」合計を加算しません" 違いが生じる・異なる?

質問2:なぜこれらは機能しませんか?関数内

ddply(mydf, .(Model), sum, Length+Length)#エラー(I):

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

2引数は1つの

これらの例は、どこかに私は「ことを示すことが多くである必要があり '長さ' に渡されたオブジェクトが見つかりません '長さ'基本的にplyrの使い方を理解していません。

アンサーまたは説明があります。

答えて

18

構文は次のとおりです。

機能が data.frameを返すことが期待されている
ddply(data.frame, variable(s), function, optional arguments) 

。あなたの状況では、

  • まとめたものは透過的に

  • 変換あなたは、さらなる議論を提供し、式の結果(...)で、新しいdata.frameを作成する関数であり、ベースR関数は、data.frames(変数によって最初に分割)を変換し、さらなる引数として指定した式に従って新しい列を追加します。これらの名前を付ける必要があります。それは変換の仕方です。

あなたはサブセット以外の機能を使用する場合は、変換、変異させる、と、内、またはあなたは、彼らがdata.frame(長さと合計はない)を返すことを確認する必要があります、要約、またはで少なくとも出力に適した長さのベクトルです。

+1

また、OPでの最初の一連の例は、式に 'val ='のようなタグを含めることを怠った場合の 'summmarise'と' transform'の間のデフォルト動作の違いです。 'summarize'は明らかにそれ自身の名前を与えますが、' transform'はそれを無視するようです。 – joran

4

私がddply(... , .(...) , summarise, ...)オペレーションを理解する方法は、グループ化変数.(...)内の異なる組み合わせの数に一致するように行数を減らすように設計されています。あなたの最初の例では、これは自然なようでした:

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

OK。私のために働くように思えます(通常のplyrユーザーではありません)。一方、transformの操作では、データフレームと同じ長さの新しい列を作成することが分かります。それはあなたの最初のtransformが達成したものでした。実行された操作のための新しい名前を作成していない

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

1ということなので、結果に割り当てられた新しいものは何もありませんでした:あなた秒1(失敗)でした。 sum=(Length+Length)を追加すると、突然名前が使用可能になりました(sumの機能はではなくが使用されました)。一般的に、列名に関数の名前を使用することは好ましくありません。

質問2:私は、.fun引数は、古い関数ではなく、(分割された)データフレームに適用されるplyr関数または何かである必要があると思います。 sum.data.frame機能はありません。しかし、「nrow」や「ncol」は理にかなっています。あなたはその位置で働くために 'str'を得ることさえできます。 length関数は、データフレームに適用される列の数を与える:

ddply(mydf, .(Model), length) # all 4's 
21

私は私が一番簡単な方法は、ブラウザであることを、Rの作業中の機能のツールどのように任意の「見える化」トラブルを抱えていたときにことを見つけます単一のインスタンス:

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

そして、リアルタイムでxを検査し、それがすべての意味を確認する必要があります。あなたはxの関数をテストすることができ、それがうまくいくならば、あなたはゴールデンです(最初のxとは異なる他のグループ化はできません)。

関連する問題