Как я могу свернуть кадр данных с помощью некоторых переменных, принимая во внимание другие
Мне нужно суммировать кадр данных с помощью некоторых переменных, игнорируя остальные. Это иногда называют свертыванием. Например. если у меня есть такой кадр данных:
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