Dplyr rowwise() : calcul ligne par ligne

La fonction mutate() effectue des opérations sur des colonnes. Par exemple, la commande mutate(mean_bmi=mean(bmi)) calcule la colonne mean_bmi comme la moyenne de la colonne bmi. Mais comment procéder si mean_bmi doit plutôt être calculée comme la moyenne de plusieurs colonnes ? Pour cela, nous avons besoin de la fonction rowwise().

Dans ces exemples, nous utilisons les données mpg disponibles dans le package tidyverse. Chargez tidyverse et mpg comme suit :

library(tidyverse)
data(mpg)

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

Pour rendre la démonstration plus claire, nous ne conservons que les colonnes numériques des données mpg. Le nouvel objet s'appelle mpg2 :

mpg2 <- mpg %>% select(where(is.numeric))

## Inspecter à nouveau les données
head(mpg2, 10)
   displ  year   cyl   cty   hwy
    1.8  1999     4    18    29
    1.8  1999     4    21    29
    2    2008     4    20    31
    2    2008     4    21    30
    2.8  1999     6    16    26
    2.8  1999     6    18    26
    3.1  2008     6    18    27
    1.8  1999     4    18    26
    1.8  1999     4    16    25
    2    2008     4    20    28

Nous créons maintenant deux nouvelles variables : ny_variabel et ny_variabel_2. Ces variables doivent correspondre à la moyenne des colonnes cyl, displ et cty. La variable ny_variabel est créée sans rowwise(). La variable ny_variabel_2 est créée avec rowwise(), ce qui signifie qu'elle est précédée de rowwise(). Nous créons les deux variables simultanément afin de pouvoir comparer directement les résultats. Le code est le suivant :

mpg2 |>
  mutate(ny_variabel = mean(c(cyl, displ, cty))) |>
  rowwise() |>
  mutate(ny_variabel_2 = mean(c(cyl, displ, cty)))
  displ  year   cyl   cty   hwy ny_variabel ny_variabel_2
    1.8  1999     4    18    29        8.74          7.93
    1.8  1999     4    21    29        8.74          8.93
    2    2008     4    20    31        8.74          8.67
    2    2008     4    21    30        8.74          9
    2.8  1999     6    16    26        8.74          8.27
    2.8  1999     6    18    26        8.74          8.93
    3.1  2008     6    18    27        8.74          9.03
    1.8  1999     4    18    26        8.74          7.93
    1.8  1999     4    16    25        8.74          7.27
    2    2008     4    20    28        8.74          8.67

Comme on le voit ci-dessus, toutes les lignes ont la même valeur de ny_variabel (8,74). Cela s'explique par le fait que mutate() a calculé une moyenne par colonne (column wise). Les valeurs de ny_variabel_2 varient en revanche d'une ligne à l'autre, car elles ont été calculées comme une moyenne par ligne (row wise).