2010-04-01 5 views
11

Ich muss einen Datenrahmen durch einige Variablen zusammenfassen und die anderen ignorieren. Dies wird manchmal als Kollaps bezeichnet. Z.B. wenn ich einen Datenrahmen wie dieses:Wie kann ich einen Datenrahmen durch einige Variablen zusammenbrechen, wobei Mittelwert über andere

Widget Type Energy 
egg 1 20 
egg 2 30 
jap 3 50 
jap 1 60 

Dann durch Widget kollabiert, mit Energie die abhängige Variable, Energie ~ Widget, ergäbe

Widget Energy 
egg 25 
jap 55 

In Excel die nächste Funktionalität könnte "Pivot-Tabellen" sein und ich habe herausgefunden, wie es in Python (http://alexholcombe.wordpress.com/2009/01/26/summarizing-data-by-combinations-of-variables-with-python/) zu tun, und hier ist ein Beispiel mit R mit DoBy-Bibliothek, um etwas sehr ähnliches zu tun (http://www.mail-archive.com/[email protected]/msg02643.html), aber gibt es eine einfache Möglichkeit, das oben zu tun? Und noch besser ist irgendetwas in die ggplot2-Bibliothek eingebaut, um Diagramme zu erstellen, die über einige Variablen hinweg kollabieren?

Antwort

13

Verwenden aggregate über einen Faktor zusammenfassen:

> df<-read.table(textConnection(' 
+ egg 1 20 
+ egg 2 30 
+ jap 3 50 
+ jap 1 60')) 
> aggregate(df$V3,list(df$V1),mean) 
    Group.1 x 
1  egg 25 
2  jap 55 

Für mehr Flexibilität Blick auf die tapply Funktion und der plyr Paket.

In ggplot2 Verwendung stat_summary zusammenzufassen

qplot(V1,V3,data=df,stat="summary",fun.y=mean,geom='bar',width=0.4) 
+2

'gibt by' auch praktisch ist, von Zeit zu Zeit. –

+1

wahr. auch 'ave' –

+3

für ein Beispiel mit' ddply' aus dem 'plyr' Paket werfen Sie einen Blick auf diese verwandte Frage: http://stackoverflow.com/questions/2473659/r-what-are-the-best-functions- to-Deal-with-concatenating-und-Averaging-Werte-in – mropa

4

Für vertraut die mit SQL, einem anderen Art und Weise Datenrahmen zu manipulieren, kann der sqldf Befehl in dem sqldf Paket sein.

1

@Jyotiirmoy erwähnt, dass dies mit der Bibliothek plyr getan werden kann. Hier ist, was das aussehen würde:

DF <- read.table(text= 
"Widget Type Energy 
egg 1 20 
egg 2 30 
jap 3 50 
jap 1 60", header=TRUE) 

library("plyr") 
ddply(DF, .(Widget), summarise, Energy=mean(Energy)) 

die

> ddply(DF, .(Widget), summarise, Energy=mean(Energy)) 
    Widget Energy 
1 egg  25 
2 jap  55