2010-04-01 5 views
11

Ho bisogno di riepilogare un frame di dati con alcune variabili, ignorando gli altri. Questo a volte viene definito come collasso. Per esempio. se ho una dataframe come questo:Come posso comprimere un dataframe con alcune variabili, prendendo la media su altri

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

poi crollare da Widget, con energia la variabile dipendente, Energia ~ Widget, produrrebbe

Widget Energy 
egg 25 
jap 55 

In Excel la funzionalità più vicina potrebbe essere "tabelle pivot" e ho capito come farlo in python (http://alexholcombe.wordpress.com/2009/01/26/summarizing-data-by-combinations-of-variables-with-python/), ed ecco un esempio con R che usa la libreria doBy per fare qualcosa di molto correlato (http://www.mail-archive.com/[email protected]/msg02643.html), ma c'è un modo semplice per fare quanto sopra? E ancora meglio c'è qualcosa incorporato nella libreria ggplot2 per creare grafici che collassano su alcune variabili?

risposta

13

Usa aggregate per riassumere in un fattore:

> 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 

Per ulteriori sguardo flessibilità alla funzione tapply e il pacchetto plyr.

In ggplot2 uso stat_summary riassumere

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

'by' si rivela utile anche di tanto in tanto. –

+1

true. anche 'ave' –

+3

per un esempio usando' ddply' dal pacchetto 'plyr' dai un'occhiata a questa domanda correlata: http://stackoverflow.com/questions/2473659/r-what-are-the-best-functions- to-deal-with-concatenating-and-averaging-values-in – mropa

4

Per coloro che hanno familiarità con SQL, un altro modo per manipolare dataframes può essere il comando sqldf nel pacchetto sqldf.

library(sqldf) 
sqldf("SELECT Widget, avg(Energy) FROM yourDataFrame GROUP BY Widget") 
1

@Jyotirmoy hanno detto che questo può essere fatto con la libreria plyr. Ecco che cosa sarebbe simile:

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

che dà

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