Opérations en ligne avec dplyr

Travailler en ligne avec dplyr

Réaliser des opérations en ligne sur un data frame avec le package dplyr est relativement mal connu, et pourtant très facilement réalisable.

Comme nous allons le voir, lorsqu’on crée des nouvelles variables à l’aide d’une opération sur des variables déjà présentes (le minimum par exemple), par défaut,  dplyr va considérer ces variables en colonnes.

Or parfois, ce qu’on a en tête, ce sont des opérations en ligne ! C’est là qu’intervient la fonction rowwise().

Je vous montre tout cela, en pas à pas, sur un petit tableau de données qui nous servira d’exemple.

Table des matières

Tableau de données exemple

Voici le tableau de données sur lequel nous allons travailler : 

mydf <- data.frame(x=1:3, y=4:6, z=7:9)
mydf
##   x y z
## 1 1 4 7
## 2 2 5 8
## 3 3 6 9 

Comportement par défaut : opérations en colonne

Si nous créons une variable u (à l’aide de la fonction mutate()) en indiquant qu’elle doit contenir le minimum des variables x, y et z, nous allons nous apercevoir que l’opération ne se fait pas en ligne (comme nous l’imaginions), mais en colonne :

library(dplyr)
mydf<- mydf %>% 
    mutate(u=min(x,y,z))
mydf
##   x y z u
## 1 1 4 7 1
## 2 2 5 8 1
## 3 3 6 9 1 

La variable u ne contient que des 1, puisque la valeur minimum des variables x, y et z (en colonne) est bien 1.

Réaliser des opérations en ligne

Pour obtenir des résultats par ligne, il faut réaliser des opérations en ligne et pour cela l’indiquer à dplyr (avant la fonction mutate()), en employant la fonction rowwise(), comme ceci :

mydf<- mydf %>%
    rowwise() %>% 
    mutate(v=min(x,y,z))
mydf
## # A tibble: 3 x 5
## # Rowwise: 
##       x     y     z     u     v
##   <int> <int> <int> <int> <int>
## 1     1     4     7     1     1
## 2     2     5     8     1     2
## 3     3     6     9     1     3 

Cette fonction permettant de faire des opérations en ligne est présente sur la page d’aide (ou cheatsheet) du package dplyr:

cheatsheet du package dplyr
description de la fonction rowwise

Remarque : vous pouvez télécharger cette page d’aide en allant dans le menu Help :

obtenir la cheatsheet de dplyr

Notez que la réalisation d’opérations en ligne par l’emploi de la fonction rowwise() entraîne au passage une conversion du format data.frame en tibble, on le voit bien à l’affichage:

Si on réalise ensuite une seconde opération, il s’agira alors d’une interprétation en ligne également, le dataframe restant alors groupé en ligne :

mydf <- mydf %>%
    mutate(a=max(x,y,z)) 
mydf
## # A tibble: 3 x 6
## # Rowwise: 
##       x     y     z     u     v     a
##   <int> <int> <int> <int> <int> <int>
## 1     1     4     7     1     1     7
## 2     2     5     8     1     2     8
## 3     3     6     9     1     3     9 

D’ailleurs, si on est attentif à la sortie, R nous indique bien qu’il y a actuellement un regroupement sur les lignes :

tibble de type rowwise

Ce qu’on peut retrouver, en questionnant R sur la class de l’objet mydf :

class(mydf)
## [1] "rowwise_df" "tbl_df"     "tbl"        "data.frame" 

Supprimer le comportement d'opérations en ligne

Pour retirer le comportement d’opérations en ligne et retrouver le comportement initial avec des opérations en colonne, il faut dégrouper les lignes en employant la fonction ungroup():

mydf<- mydf %>%
    ungroup() %>% 
    mutate(b=max(x,y,z))

mydf
## # A tibble: 3 x 7
##       x     y     z     u     v     a     b
##   <int> <int> <int> <int> <int> <int> <int>
## 1     1     4     7     1     1     7     9
## 2     2     5     8     1     2     8     9
## 3     3     6     9     1     3     9     9 

Ici on retrouve la valeur 9, qui est bien le max des colonnes x, y et z. Et la notion de rowwise n’apparait plus à l’affichage (en dessous des informations de dimensions du tibble).

 Au final, on peut enchainer toutes les commandes ensemble, comme ceci  :

mydf2 <- data.frame(x=1:3, y=4:6, z=7:9)


mydf2<- mydf2 %>% 
    mutate(u=min(x,y,z)) %>% 
    rowwise() %>% 
    mutate(v=min(x,y,z)) %>% 
    mutate(a=max(x,y,z)) %>% 
    ungroup() %>% 
    mutate(b=max(x,y,z))

mydf2
## # A tibble: 3 x 7
##       x     y     z     u     v     a     b
##   <int> <int> <int> <int> <int> <int> <int>
## 1     1     4     7     1     1     7     9
## 2     2     5     8     1     2     8     9
## 3     3     6     9     1     3     9     9 

Et en questionnant R sur la classe de l’objet mydf2, la notion de rowwise n’apparaît plus :

class(mydf2)
## [1] "tbl_df"     "tbl"        "data.frame" 

Remarques

Opérations en ligne sur des colonnes contiguës

Si on souhaite une opération sur un ensemble colonnes contiguës, il n’est pas nécessaire de les nommer toutes. Nous pouvons alors coupler la fonction rowwise() à la fonction c_across(). Par exemple pour additionner les colonnes entre x et b :

mydf <- mydf %>% 
    rowwise() %>% 
    mutate(d=sum(c_across(x:b)))

mydf
## # A tibble: 3 x 8
## # Rowwise: 
##       x     y     z     u     v     a     b     d
##   <int> <int> <int> <int> <int> <int> <int> <int>
## 1     1     4     7     1     1     7     9    30
## 2     2     5     8     1     2     8     9    35
## 3     3     6     9     1     3     9     9    40 

Vous pourrez retrouver davantage d’informations sur cette fonction `rowwise()` sur cette vignette.

Au sujet d'une mauvaise manipulation du raccourci

Pour insérer un pipe , c’est-à-dire le symbole %>% plus facilement, vous pouvez employer le raccourci CTRL + SHIFT + M.

Mais si vous vous trompez de touche en appuyant sur %, à la place de M, (les deux touches sont cote à cote), c’est-à-dire, que vous faites la combinaison CTRL + SHIFT + %, vous obtenez zoom sur l’explorateur de fichiers (l’onglet file de la fenêtre en bas à droite). Ce qui peut être un peu anxiogène la première fois 😱😱😱

Mais pas de panique !! 😎

Pour revenir à vos 4 fenêtres, il suffit de refaire la même combinaison : CTRL + SHIFT + % ou alors de cliquer sur le bouton des 4 petits carrés dans le menu supérieur de R Studio.

obtenir la cheatsheet

Conlusion

J’espère que ce court article vous aura permis d’apprendre une nouvelle fonction du package dplyr.

Si vous souhaitez allez plus loin, et apprendre à manipuler rapidement et efficacement vos données, je vous informe (ou vous rappelle) que j’animerai, en distanciel, la formation “Maîtrisez la manipulation de vos tableaux de données avec dplyr, tidyr et lubridate” le 9 décembre 2021. Vous trouverez le programme, le tarif, et le bulletin d’inscription en cliquant sur le lien ci-dessous :

Poursuivez votre lecture

Une réponse

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.