2013-01-21 4 views
5

Ich habe Probleme, die Verwendung des plyr-Pakets zu verstehen. Ich versuche es zu verwenden, um Datenframes zu teilen, die in einer Liste gespeichert sind, eine Funktion anzuwenden, die Ergebnisse als Datenframes zu speichern und die Datenframes wieder als Liste zu kombinieren. So die follwing Daten gegeben:Probleme bei der Verwendung des plyr-Pakets und beim Arbeiten mit Listen

#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) 

Ich mag würde den Mittelwert jeder Gruppe in d jeden Datenrahmen definiert berechnen. Wenn ich nur auf einem Datenrahmen verwenden plyr würde eine Möglichkeit (den Mittelwert nach einer bestimmten Spalte von Gruppen zu berechnen) das plyr Paket zu verwenden wäre:

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

aber wie bewerbe ich mich auf jeder Spalte innerhalb der Datenrahmen und auf jedem Datenrahmen in der Liste? und wie kann ich alle Daten neu zusammensetzen, damit ich am Ende eine Liste mit Matrizen bekomme, die die Ergebnisse enthalten? Sorry für diese sehr grundlegende Frage, aber ich bin neu in R und ich habe wirklich versucht, dies für eine ganze Weile zu lösen ... thx.

Antwort

1

Hier ist eine Lösung, die llply() und ddply() kombiniert. Zuerst wird llply() Funktion auf jedes Element der Liste anwenden und eine Liste zurückgeben. Dann wird ddply() auf jeden Datenrahmen der Liste angewendet und teilt auch jeden Datenrahmen gemäß der Spalte d. Die Funktion colMeans() wird verwendet, um den Mittelwert für jede numerische Spalte zu berechnen.

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

perfekt und einfach zu bedienen. daran dachte ich, aber ich weiß nicht, wie ich das Objekt in ddply benennen soll. So funktioniert es jetzt! Danke. – Joschi

3

Sie müssen alle Daten in eine große data.frame setzen:

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 

... und dann ddply auf sie aus.

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 

die den Mittelwert der einzelnen Variablen gibt (a-c) pro Level von Faktor d und pro Teildatenframe (DF1-DF3).

3

Sie können immer nur lapply Ihre 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)))) 

oder Ihr Code genau:

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

Danke. Das ist worüber ich nachgedacht habe, aber ich weiß nicht, wie ich das Objekt in ddply benennen soll. alles macht jetzt sinn mit der innenfunktion ... ich denke der erste code verfehlt ein) am ende. Es funktioniert gut, aber ich muss manuell alle Spalten indizieren. Der Downer-Code gibt nur die Mittelwerte für a zurück. – Joschi

Verwandte Themen