2010-04-01 28 views
11

Je dois résumer un cadre de données par quelques variables, en ignorant les autres. Ceci est parfois appelé effondrement. Par exemple. si j'ai un dataframe comme ceci:Comment est-ce que je peux réduire une trame de données par certaines variables, en prenant la moyenne à travers d'autres

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

Puis l'effondrement de Widget, avec l'énergie de la variable dépendante, l'énergie ~ Widget, donnerait

Widget Energy 
egg 25 
jap 55 

Dans Excel la fonctionnalité la plus proche peut-être « tableaux croisés dynamiques » et j'ai travaillé comment le faire en python (http://alexholcombe.wordpress.com/2009/01/26/summarizing-data-by-combinations-of-variables-with-python/), et voici un exemple avec R utilisant la bibliothèque doBy pour faire quelque chose de très lié (http://www.mail-archive.com/[email protected]/msg02643.html), mais y a-t-il un moyen facile de faire ce qui précède? Et encore mieux y a-t-il quelque chose de construit dans la bibliothèque ggplot2 pour créer des graphes qui s'effondrent à travers certaines variables?

Répondre

13

Utilisez aggregate pour résumer sur un facteur:

> 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 

Pour plus d'aspect de flexibilité à la fonction tapply et le paquet plyr.

En ggplot2 utilisation stat_summary pour résumer

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

'by' est également très pratique de temps en temps. –

+1

vrai. aussi 'ave' –

+3

pour un exemple utilisant' ddply' du paquet 'plyr' jetez un oeil à cette question connexe: http://stackoverflow.com/questions/2473659/r-what-are-the-best-functions- à-traiter-avec-concaténant-et-moyennage-valeurs-dans – mropa

4

Pour ceux qui sont familiers avec SQL, une autre façon de manipuler dataframes peut être la commande sqldf dans le package sqldf.

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

@Jyotirmoy a mentionné que cela peut être fait avec la bibliothèque plyr. Voici ce que cela ressemblerait à ceci:

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

qui donne

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