Как я могу свернуть фрейм данных по некоторым переменным, принимая среднее значение по другим - PullRequest
14 голосов
/ 01 апреля 2010

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

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

Тогда сворачивание с помощью Widget с зависимой переменной Energy, Widget Energy ~ приведет к

Widget Energy  
egg  25  
jap  55  

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

Ответы [ 3 ]

14 голосов
/ 01 апреля 2010

Используйте 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)
5 голосов
/ 01 июня 2012

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

library(sqldf)
sqldf("SELECT Widget, avg(Energy) FROM yourDataFrame GROUP BY Widget")
1 голос
/ 01 июня 2012

@ 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
...