Как я могу свернуть кадр данных с помощью некоторых переменных, принимая во внимание другие

Мне нужно суммировать кадр данных с помощью некоторых переменных, игнорируя остальные. Это иногда называют свертыванием. Например. если у меня есть такой кадр данных:

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

Затем, свернувшись с помощью виджета, с энергией зависимая переменная Energy ~ Widget даст

Widget Energy  
egg  25  
jap  55  

В Excel самой близкой функциональностью может быть "Pivot tables", и я разработал, как это сделать в python (http://alexholcombe.wordpress.com/2009/01/26/summarizing-data-by-combinations-of-variables-with-python/), и вот пример с R, используя библиотеку doBy, чтобы сделать что-то очень связанное (http://www.mail-archive.com/[email protected]/msg02643.html), но есть ли простой способ сделать выше? И еще лучше что-нибудь встроенное в библиотеку ggplot2 для создания графиков, которые рушатся на некоторые переменные?

Ответ 1

Используйте aggregate для суммирования по фактору:

> 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

Для большей гибкости посмотрите на функцию tapply и пакет plyr.

В ggplot2 используйте stat_summary для подведения итогов

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

Ответ 2

Для тех, кто знаком с SQL, другим способом манипулирования файлами данных может быть команда sqldf в пакете sqldf.

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

Ответ 3

@Jyotirmoy упомянул, что это можно сделать с помощью библиотеки plyr. Вот как это выглядит:

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

который дает

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