2010-04-01 12 views
11

Necesito resumir un marco de datos por algunas variables, ignorando las demás. Esto a veces se conoce como colapso. P.ej. si tengo una trama de datos de esta manera:¿Cómo puedo colapsar un marco de datos mediante algunas variables, tomando la media entre otros?

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

Luego colapsar por Widget, la energía de la variable dependiente, Energía ~ Widget, produciría

Widget Energy 
egg 25 
jap 55 

En Excel la funcionalidad más cercano podría ser "tablas dinámicas" y he resuelto cómo hacerlo en python (http://alexholcombe.wordpress.com/2009/01/26/summarizing-data-by-combinations-of-variables-with-python/), y aquí hay un ejemplo con R que usa la biblioteca doBy para hacer algo muy relacionado (http://www.mail-archive.com/[email protected]/msg02643.html), pero ¿hay alguna manera fácil de hacer lo anterior? Y aún mejor, ¿hay algo incorporado en la biblioteca ggplot2 para crear tramas que colapsen en algunas variables?

Respuesta

13

Uso aggregate resumir entre un factor:

> 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 

Para más mirada flexibilidad a la función tapply y el paquete plyr.

En ggplot2 uso stat_summary resumir

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

'BY' también viene muy bien de vez en cuando. –

+1

cierto. también 'ave' –

+3

para un ejemplo usando' ddply' del paquete 'plyr' eche un vistazo a esta pregunta relacionada: http://stackoverflow.com/questions/2473659/r-what-are-the-best-functions- to-deal-with-concatenating-and-average-values-in – mropa

4

Para aquellos familiarizados con SQL, otra manera de manipular tramas de datos puede ser el comando sqldf en el paquete sqldf.

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

@Jyotirmoy mencionó que esto se puede hacer con la biblioteca plyr. Esto es lo que se vería así:

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

que da

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