web-dev-qa-db-fra.com

Comment obtenir des statistiques récapitulatives par groupe

J'essaie d'obtenir plusieurs statistiques récapitulatives dans R/S-PLUS groupées par colonne catégorique en une seule fois. J'ai trouvé quelques fonctions, mais toutes font une statistique par appel, comme `aggreg ().

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 moyenne, min, max, standard, etc., en un seul appel, est-ce faisable?

56
user1289220

Je vais mettre dans 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 remplacer par résumé.

87
BenBarnes

dplyr le paquet 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 3ème quadrant

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

Utiliser le paquet purrr de Hadley Wickham est très simple. Utilisez split pour scinder le data_frame Passé en groupes, puis utilisez map pour appliquer la fonction summary à chaque groupe.

library(purrr)

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

Il y a beaucoup de façons différentes de s'y prendre, mais je suis partial envers describeBy dans le package psych:

describeBy(df$dt, df$group, mat = TRUE) 
13
Jim M.

jetez un coup d'œil au paquetage plyr. Plus précisément, ddply

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

après 5 longues années, je suis sûr que cette réponse ne suscitera guère d’attention, mais il reste à compléter toutes les options, voici celle avec data.table

library(data.table)
setDT(df)[ , list(mean_gr = mean(dt), sum_gr = sum(dt)) , by = .(group)]
#   group mean_gr sum_gr
#1:     A      61    244
#2:     B      66    396
#3:     C      68    408
#4:     D      61    488 
6
joel.wilson

Outre describeBy, le package doBy est une autre option. Il fournit une grande partie des fonctionnalités de SAS SOMMAIRE DU PROCESS. Détails: http://www.statmethods.net/stats/descriptives.html

6
dwstu

Certaines des autres approches fonctionnent, mais c’est assez proche de ce que vous faisiez et n’utilisez que la base r. Si vous connaissez la commande d'agrégat, cela peut être plus intuitif.

with( df , aggregate( dt , by=list(group) , FUN=summary)  )
2
MatthewR

Tout d'abord, cela dépend de votre version de R. Si vous avez passé la version 2.11, vous pouvez utiliser aggreggate avec plusieurs fonctions de résultat (résumé, par instance ou votre propre fonction). Sinon, vous pouvez utiliser la réponse de Justin.

1
CPHM