2013-01-21 5 views
5

plyrパッケージの使い方を理解するのが難しいです。私は、リストに格納されたデータフレームを分割し、関数を適用し、結果をデータフレームとして保存し、データフレームをリストとして再度結合するために使用しようとしています。私は、各データフレームのDで定義された各グループの平均値を計算したいplyrパッケージを使用する上で問題があり、リストを使って作業する

#create test dfs 
    df1<-data.frame(a=sample(1:50,10),b=sample(1:50,10),c=sample(1:50,10),d=(c("a","b","c","a","a","b","b","a","c","d"))) 
    df2<-data.frame(a=sample(1:50,9),b=sample(1:50,9),c=sample(1:50,9),d=(c("e","f","g","e","e","f","f","e","g"))) 
    df3<-data.frame(a=sample(1:50,8),b=sample(1:50,8),c=sample(1:50,8),d=(c("h","i","j","h","h","i","i","h"))) 

    #make them a list 
    list.1<-list(df1=df1,df2=df2,df3=df3) 

: だからfollwingデータを与えられました。 私はplyrパッケージを使用する可能性は次のようになります(グループによる特定の列で平均を計算するために)一つだけのデータフレームにplyrを使用したい場合:

ddply(df1,.(d),summarise, mean=mean(a)) 

が、どのように私は内のすべての列の上にそれを適用しますデータフレーム、およびリスト内のすべてのデータフレームに適用されますか?どのようにしてすべてのデータを再集計して、最終的に結果が一致するマトリクスを持つリストを得ることができますか?この非常に基本的な質問には申し訳ありませんが、私はRには新しく、これをかなりの時間にわたって解決しようとしてきました。

答えて

1

llply()ddply()を組み合わせたソリューションがあります。まず、llply()は、関数をlistの各要素に適用し、リストを返します。次にddply()がリストの各データフレームに適用され、さらに各データフレームは列dに従って分割されます。関数colMeans()は、各数値列の平均値を計算するために使用されます。

llply(list.1,function(x) ddply(x,.(d),function(x) colMeans(x[,1:3]))) 
$df1 
    d  a  b  c 
1 a 22.25000 26.25 34.25000 
2 b 19.66667 22.00 28.66667 
3 c 37.00000 44.50 18.00000 
4 d 17.00000 3.00 4.00000 

$df2 
    d  a  b c 
1 e 20.50000 32.25000 18.5 
2 f 25.33333 34.33333 21.0 
3 g 20.50000 26.50000 16.5 

$df3 
    d a  b  c 
1 h 17.5 26.50000 37.25000 
2 i 45.0 22.33333 26.33333 
3 j 25.0 33.00000 42.00000 
+0

完璧で使いやすいです。それは私が考えていたものでしたが、私はddplyの中にオブジェクトの名前を付ける方法を知りませんでした。これは今のように動作します!ありがとうございました。 – Joschi

3

あなたは一つの大きなdata.frameにすべてのデータを配置する必要があります。

library(reshape) 

big_dataframe = ldply(list.1, function(x) melt(x, id.vars = "d")) 
> head(big_dataframe) 
    .id d variable value 
1 df1 a  a 44              
2 df1 b  a 17              
3 df1 c  a 15              
4 df1 a  a 30              
5 df1 a  a 49              
6 df1 b  a 33 

...そしてそれにddplyを使用しています。各変数(aからc)の平均値を与える

res = ddply(big_dataframe, .(.id, d, variable), summarise, mn = mean(value)) 
> res 
    .id d variable  mn 
1 df1 a  a 40.00000             
2 df1 a  b 25.25000             
3 df1 a  c 31.25000             
4 df1 b  a 22.66667             
5 df1 b  b 16.00000             
6 df1 b  c 26.00000             
7 df1 c  a 9.00000             
8 df1 c  b 16.50000             
9 df1 c  c 15.00000             
10 df1 d  a 28.00000             
11 df1 d  b 24.00000             
12 df1 d  c 39.00000             
13 df2 e  a 18.50000             
14 df2 e  b 15.50000             
15 df2 e  c 16.50000             
16 df2 f  a 26.33333             
17 df2 f  b 42.00000             
18 df2 f  c 37.00000             
19 df2 g  a 26.50000             
20 df2 g  b 22.00000             
21 df2 g  c 31.00000             
22 df3 h  a 29.25000             
23 df3 h  b 34.25000             
24 df3 h  c 32.00000             
25 df3 i  a 30.33333             
26 df3 i  b 40.00000             
27 df3 i  c 24.33333             
28 df3 j  a 21.00000             
29 df3 j  b 5.00000             
30 df3 j  c 46.00000 

因子dのレベルごとに、サブデータフレームあたり(DF1、DF3)。

3

することができます常にだけlapplyあなたddply

lapply(list.1, function(x) ddply(x, .(d), function(x) 
          data.frame(a=mean(x$a),b=mean(x$b),c= mean(x$c)))) 

か、正確にあなたのコードを使用して:

lapply(list.1, function(x) ddply(x,.(d),summarise, mean=mean(a))) 
+0

ありがとうございます。それは私が考えていたことですが、私はddply内でオブジェクトの名前を付ける方法を知りませんでした。内部関数ではすべて意味が成り立ちます...私は最初のコードが最後に欠けていると思います。それは正常に動作しますが、私はすべての列を手動でインデックスを作成する必要があります。ダウンコードはaの手段のみを返します。 – Joschi

関連する問題