Cómo obtener estadísticas resumidas por grupo

Resuelto user1289220 asked hace 54 años • 0 respuestas

Estoy intentando obtener múltiples estadísticas resumidas en R/S-PLUS agrupadas por columna categórica de una sola vez. Encontré un par de funciones, pero todas hacen una estadística por llamada, como aggregate().

data <- c(62, 60, 63, 59, 63, 67, 71, 64, 65, 66, 68, 66, 
          71, 67, 68, 68, 56, 62, 60, 61, 63, 64, 63, 59)
grp <- factor(rep(LETTERS[1:4], c(4,6,6,8)))
df <- data.frame(group=grp, dt=data)
mg <- aggregate(df$dt, by=df$group, FUN=mean)    
mg <- aggregate(df$dt, by=df$group, FUN=sum)    

Lo que estoy buscando es obtener múltiples estadísticas para el mismo grupo como media, mínima, máxima, estándar, etc. en una sola llamada, ¿es factible?

user1289220 avatar Jan 01 '70 08:01 user1289220
Aceptado

1.tapply

Pondré mis dos centavos por tapply().

tapply(df$dt, df$group, summary)

Puede escribir una función personalizada con las estadísticas específicas que desee o formatear los resultados:

tapply(df$dt, df$group,
  function(x) format(summary(x), scientific = TRUE))
$A
       Min.     1st Qu.      Median        Mean     3rd Qu.        Max. 
"5.900e+01" "5.975e+01" "6.100e+01" "6.100e+01" "6.225e+01" "6.300e+01" 

$B
       Min.     1st Qu.      Median        Mean     3rd Qu.        Max. 
"6.300e+01" "6.425e+01" "6.550e+01" "6.600e+01" "6.675e+01" "7.100e+01" 

$C
       Min.     1st Qu.      Median        Mean     3rd Qu.        Max. 
"6.600e+01" "6.725e+01" "6.800e+01" "6.800e+01" "6.800e+01" "7.100e+01" 

$D
       Min.     1st Qu.      Median        Mean     3rd Qu.        Max. 
"5.600e+01" "5.975e+01" "6.150e+01" "6.100e+01" "6.300e+01" "6.400e+01"

2.data.table

El data.tablepaquete ofrece muchas herramientas útiles y rápidas para este tipo de operaciones:

library(data.table)
setDT(df)
> df[, as.list(summary(dt)), by = group]
   group Min. 1st Qu. Median Mean 3rd Qu. Max.
1:     A   59   59.75   61.0   61   62.25   63
2:     B   63   64.25   65.5   66   66.75   71
3:     C   66   67.25   68.0   68   68.00   71
4:     D   56   59.75   61.5   61   63.00   64
BenBarnes avatar Mar 24 '2012 10:03 BenBarnes

El paquete dplyr podría ser una buena alternativa a este problema:

library(dplyr)

df %>% 
  group_by(group) %>% 
  summarize(mean = mean(dt),
            sum = sum(dt))

Para obtener el 1er cuadrante y el 3er cuadrante

df %>% 
  group_by(group) %>% 
  summarize(q1 = quantile(dt, 0.25),
            q3 = quantile(dt, 0.75))
Jot eN avatar Nov 10 '2014 10:11 Jot eN