85 votes

Comment obtenir des statistiques récapitulatives par groupe

J'essaie d'obtenir plusieurs statistiques récapitulatives dans R/S-PLUS regroupées par colonne catégorielle en un seul coup. J'ai trouvé quelques fonctions, mais toutes font une statistique par appel, comme 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)    

Ce que je recherche, c'est d'obtenir plusieurs statistiques pour le même groupe comme la moyenne, le min, le max, la norme, etc. en un seul appel, est-ce faisable ?

123voto

BenBarnes Points 8928

1. tapply

Je vais mettre mes deux cents pour tapply() .

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

Vous pouvez écrire une fonction personnalisée avec les statistiques spécifiques que vous souhaitez ou formater les résultats :

 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

Le data.table propose de nombreux outils utiles et rapides pour ces types d'opérations :

 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

52voto

Jot eN Points 422

Le package dplyr pourrait être une bonne alternative à ce problème :

 library(dplyr)

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

Pour obtenir le 1er quadrant et le 3e quadrant

 df %>% 
  group_by(group) %>% 
  summarize(q1 = quantile(dt, 0.25),
            q3 = quantile(dt, 0.75))

36voto

conor Points 551

En utilisant le package ronronnement de Hadley Wickham, c'est assez simple. Utilisez split pour diviser les data_frame passés en groupes, puis utilisez map pour appliquer la fonction summary à chaque groupe.

 library(purrr)

df %>% split(.$group) %>% map(summary)

12voto

Justin Points 19077

jetez un œil au package plyr Plus précisément, ddply

 ddply(df, .(group), summarise, mean=mean(dt), sum=sum(dt))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X