Dplyr summarise() : résumer des variables (colonnes)

Il est essentiel de savoir agréger (résumer) l'information contenue dans les colonnes d'un data frame. C'est précisément le rôle de la fonction summarise(). Les fonctions summarise() et summarize() sont des synonymes strictement identiques. Elles s'utilisent en combinaison avec d'autres fonctions pour calculer des moyennes, des médianes, des mesures de dispersion ou tout autre calcul d'intérêt.

Fonctions couramment utilisées avec summarise() :

  • Mesures de tendance centrale : mean(), median()
  • Mesures de dispersion : sd(), IQR(), mad()
  • Étendues : min(), max(), quantile()
  • Positions : first(), last(), nth()
  • Effectifs : n(), n_distinct()
  • Valeurs logiques : any(), all()

Dans ce chapitre, nous utilisons les données mpg pour illustrer ces fonctions. Chargez les données mpg en activant le tidyverse comme suit :

## Activer le tidyverse
library(tidyverse)

## Charger les données mpg
data(mpg)

## Inspecter les premières lignes
head(mpg)
  manufacturer model displ  year   cyl trans      drv     cty   hwy fl    class
1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p     compact
2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p     compact
3 audi         a4      2    2008     4 manual(m6) f        20    31 p     compact
4 audi         a4      2    2008     4 auto(av)   f        21    30 p     compact
5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p     compact
6 audi         a4      2.8  1999     6 manual(m5) f        18    26 p     compact

Exemple 1 : calculer la moyenne, l'écart-type et l'écart interquartile de la colonne displ de mpg :

 mpg |>
  summarise(mean_displ = mean(displ, na.rm=T),
            sd_displ = sd(displ, na.rm=T),
            iqr_displ = IQR(displ, na.rm=T))
  mean_displ sd_displ iqr_displ
        3.47     1.29       2.2

Comme on le voit ci-dessus, les données mpg ont été résumées en un nouveau data frame ne comportant qu'une seule ligne. Les nouvelles colonnes correspondent aux valeurs que nous avons spécifiées dans summarise().

Exemple 2 : utiliser group_by() avec summarise().

Dans cet exemple, nous résumons les mêmes variables que dans l'exemple précédent, mais cette fois séparément pour chaque constructeur automobile. Notez que nous écrivons ungroup() tout à la fin pour désactiver le regroupement de notre data frame.

mpg |>
  group_by(manufacturer) |>
  summarise(mean_displ = mean(displ, na.rm=T),
            sd_displ = sd(displ, na.rm=T),
            iqr_displ = IQR(displ, na.rm=T))
  manufacturer   mean_displ sd_displ iqr_displ
  audi               2.54     0.673     1.03
  chevrolet          5.06     1.37      1.4
  dodge              4.38     0.868     0.9
  ford               4.54     0.541     0.600
  honda              1.71     0.145     0.2
  hyundai            2.43     0.365     0.55
  jeep               4.58     1.02      1.03
  land rover         4.3      0.258     0.300
  lincoln            5.4      0         0
  mercury            4.4      0.490     0.700
  nissan             3.27     0.864     1
  pontiac            3.96     0.808     0
  subaru             2.46     0.109     0
  toyota             2.95     0.931     1.15
  volkswagen         2.26     0.443     0.5

Si vous souhaitez enregistrer ce résultat dans un nouveau data frame, il est conseillé d'écrire ungroup() tout à la fin afin que le nouveau data frame ne conserve pas le regroupement, car cela peut conduire à des résultats inattendus. Pour enregistrer les données mpg dans (par exemple) l'objet mpg2, le code est le suivant (notez ungroup() tout à la fin) :

mpg2 <- mpg |>
  group_by(manufacturer) |>
  summarise(mean_displ = mean(displ, na.rm=T),
            sd_displ = sd(displ, na.rm=T),
            iqr_displ = IQR(displ, na.rm=T)) |>
  ungroup()

Exemple 3 : calculer le nombre d'observations avec summarise() :

Vous pouvez utiliser la fonction n() pour calculer le nombre d'observations dans chaque groupe lorsque vous utilisez summarise(). Voici le même exemple que ci-dessus, complété par n() pour calculer le nombre d'observations :

mpg |>
  group_by(manufacturer) |>
  summarise(n = n(),
            mean_displ = mean(displ, na.rm=T),
            sd_displ = sd(displ, na.rm=T),
            iqr_displ = IQR(displ, na.rm=T))
manufacturer     n mean_displ sd_displ iqr_displ
audi            18       2.54    0.673     1.03
chevrolet       19       5.06    1.37      1.4
dodge           37       4.38    0.868     0.9
ford            25       4.54    0.541     0.600
honda            9       1.71    0.145     0.2
hyundai         14       2.43    0.365     0.55
jeep             8       4.58    1.02      1.03
land rover       4       4.3     0.258     0.300
lincoln          3       5.4     0         0
mercury          4       4.4     0.490     0.700
nissan          13       3.27    0.864     1
pontiac          5       3.96    0.808     0
subaru          14       2.46    0.109     0
toyota          34       2.95    0.931     1.15
volkswagen      27       2.26    0.443     0.5