188 votos

¿Cómo resumir los datos por grupo en R?

Tengo un marco de datos R como este:

         age group
1   23.0883     1
2   25.8344     1
3   29.4648     1
4   32.7858     2
5   33.6372     1
6   34.9350     1
7   35.2115     2
8   35.2115     2
9   35.2115     2
10  36.7803     1
...

Necesito obtener el marco de datos en la siguiente forma:

 group mean     sd
1     34.5     5.6
2     32.3     4.2
...

El número de grupo puede variar, pero sus nombres y cantidad se pueden obtener llamando al levels(factor(data$group))

¿Qué manipulaciones se deben hacer con los datos para obtener el resultado?

103voto

ocram Puntos 9992

Una posibilidad es utilizar la función agregada . Por ejemplo,

 aggregate(data$age, by=list(data$group), FUN=mean)[2]

le da la segunda columna del resultado deseado.

26voto

HarsH1610 Puntos 21

Dado que está manipulando un marco de datos, el dplyr es probablemente la forma más rápida de hacerlo.

 library(dplyr)
dt <- data.frame(age=rchisq(20,10), group=sample(1:2,20, rep=T))
grp <- group_by(dt, group)
summarise(grp, mean=mean(age), sd=sd(age))

o de manera equivalente, usando el operador de tubería dplyr / magrittr

 library(dplyr)
dt <- data.frame(age=rchisq(20,10), group=sample(1:2,20, rep=T))
group_by(dt, group) %>%
 summarise(mean=mean(age), sd=sd(age))

EDITAR el uso completo del operador de tubería:

 library(dplyr)
data.frame(age=rchisq(20,10), group=sample(1:2,20, rep=T)) %>%
  group_by(group) %>%
  summarise(mean=mean(age), sd=sd(age))

11voto

Eric Davis Puntos 1542

Además de las sugerencias existentes, es posible que desee revisar la describe.by función en el psych paquete.

Proporciona una serie de estadísticas descriptivas que incluyen la media y la desviación estándar en función de una variable de agrupación.

11voto

stiduck Puntos 450

¡Genial, gracias bquast por agregar la solución dplyr!

Resulta que entonces, dplyr y data.table están muy cerca:

 library(plyr)
library(dplyr)
library(data.table)
library(rbenchmark)

dtf <- data.frame(age=rchisq(100000,10),group=factor(sample(1:10,100000,rep=T)))
dt <- data.table(dtf)

setkey(dt,group)

a<-benchmark(ddply(dtf,~group,plyr:::summarise,mean=mean(age),sd=sd(age)),
         dt[,list(mean=mean(age),sd=sd(age)),by=group],
         group_by(dt, group) %>% summarise(mean=mean(age),sd=sd(age) ),
         group_by(dtf, group) %>% summarise(mean=mean(age),sd=sd(age) )
)

a[, c(1,3,4)]

data.table sigue siendo el más rápido, seguido muy de cerca por dplyr (), que curiosamente parece más rápido en data.frame que en data.table:

                                                               test elapsed relative
1 ddply(dtf, ~group, plyr:::summarise, mean = mean(age), sd = sd(age))   1.689    4.867
2               dt[, list(mean = mean(age), sd = sd(age)), by = group]   0.347    1.000
4   group_by(dtf, group) %>% summarise(mean = mean(age), sd = sd(age))   0.369    1.063
3    group_by(dt, group) %>% summarise(mean = mean(age), sd = sd(age))   0.580    1.671

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X