3 Recoder vos données

Vos tables de données ne seront pas forcément propres ou au bon format lorsque vous les importerez. Il importe donc de les recoder.

Ce chapitre passe en revue rapidement les opérations qui vous permettront de recoder vos données. Cela n’étant pas l’objet de la formation, vous pouvez vous reporter aux ressources pour plus de détails.

dplyr fonctionne avec :

  • des verbes qui représentent autant d’opérations ;
  • un opérateur pour chaîner les fonctions, qu’on appelle le pipe et qui s’écrit %>%.

3.1 Le pipe

Le pipe permet d’enchaîner les opérations.

Exemple, vous vous préparez le matin. Vous enchaînez donc plusieurs opérations, qui peuvent nécessiter des étapes intermédiaires.

Vous pouvez aussi les effectuer d’un bloc, mais cela devient moins lisible :

Ou alors vous pouvez utiliser le pipe pour enchaîner les opérations de façon plus claire. :

On procédera ainsi ici.

3.2 Données

Pour le reste de l’explication, on utilisera les données iris, présentes de base dans R.

## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            1.4         0.2 setosa 
##  3          4.7         3.2          1.3         0.2 setosa 
##  4          4.6         3.1          1.5         0.2 setosa 
##  5          5           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # ... with 140 more rows

3.3 Modifier des colonnes : mutate

Il s’agit de modifier une colonne. On donne le nom de la nouvelle colonne puis l’opération de création à partir de l’ancienne, avec un = entre les deux. La nouvelle colonne peut avoir le même nom que l’ancienne et la remplace alors.

## # A tibble: 150 x 7
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_2 Sepal.Length_4
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>            <dbl>          <dbl>
##  1          5.1         3.5          1.4         0.2 setosa            10.2           20.4
##  2          4.9         3            1.4         0.2 setosa             9.8           19.6
##  3          4.7         3.2          1.3         0.2 setosa             9.4           18.8
##  4          4.6         3.1          1.5         0.2 setosa             9.2           18.4
##  5          5           3.6          1.4         0.2 setosa            10             20  
##  6          5.4         3.9          1.7         0.4 setosa            10.8           21.6
##  7          4.6         3.4          1.4         0.3 setosa             9.2           18.4
##  8          5           3.4          1.5         0.2 setosa            10             20  
##  9          4.4         2.9          1.4         0.2 setosa             8.8           17.6
## 10          4.9         3.1          1.5         0.1 setosa             9.8           19.6
## # ... with 140 more rows

On peut enchaîner plus opérations, en les séparant par une virgule, même sur des colonnes crées juste avant.

3.4 Filtrer des valeurs : filter

Cela permet de spécifier quelles valeurs on souhaite. On utilisera les opérateurs d’égalité ==, de différence != ou d’inclusion %in%.

## # A tibble: 50 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          5.1         3.5          1.4         0.2 setosa 
##  2          4.9         3            1.4         0.2 setosa 
##  3          4.7         3.2          1.3         0.2 setosa 
##  4          4.6         3.1          1.5         0.2 setosa 
##  5          5           3.6          1.4         0.2 setosa 
##  6          5.4         3.9          1.7         0.4 setosa 
##  7          4.6         3.4          1.4         0.3 setosa 
##  8          5           3.4          1.5         0.2 setosa 
##  9          4.4         2.9          1.4         0.2 setosa 
## 10          4.9         3.1          1.5         0.1 setosa 
## # ... with 40 more rows

On peut spécifier plusieurs conditions avec & (et) ou | (ou) et les parenthèses.

3.5 Sélectionner des colonnes : select

Si l’on ne veut conserver que certaines colonnes, on peut les indiquer grâce à ce verbe.

## # A tibble: 150 x 2
##    Species Sepal.Length
##    <fct>          <dbl>
##  1 setosa           5.1
##  2 setosa           4.9
##  3 setosa           4.7
##  4 setosa           4.6
##  5 setosa           5  
##  6 setosa           5.4
##  7 setosa           4.6
##  8 setosa           5  
##  9 setosa           4.4
## 10 setosa           4.9
## # ... with 140 more rows

Il fonctionne aussi en négative avec un - devant le nom de la colonne.

L’utilisation de certaines fonctions type starts_with() permet de gagner en efficacité.

3.6 Trier : arrange

On trie. Pour faire dans le sens inverse, il faut utiliser arrange(desc(x)).

## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  1          4.9         3.1          1.5         0.1 setosa 
##  2          4.8         3            1.4         0.1 setosa 
##  3          4.3         3            1.1         0.1 setosa 
##  4          5.2         4.1          1.5         0.1 setosa 
##  5          4.9         3.6          1.4         0.1 setosa 
##  6          5.1         3.5          1.4         0.2 setosa 
##  7          4.9         3            1.4         0.2 setosa 
##  8          4.7         3.2          1.3         0.2 setosa 
##  9          4.6         3.1          1.5         0.2 setosa 
## 10          5           3.6          1.4         0.2 setosa 
## # ... with 140 more rows

3.7 Top : top_n

Pour faire un top, on lui précise le nombre et la variable qui sert à trier. Par exemple si je veux le top 5 par longueur des pétales.

## # A tibble: 5 x 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>    
## 1          7.6         3            6.6         2.1 virginica
## 2          7.7         3.8          6.7         2.2 virginica
## 3          7.7         2.6          6.9         2.3 virginica
## 4          7.7         2.8          6.7         2   virginica
## 5          7.9         3.8          6.4         2   virginica

3.8 Renommer : rename

Cela sert à renommer des colonnes.

## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width a     
##           <dbl>       <dbl>        <dbl>       <dbl> <fct> 
##  1          5.1         3.5          1.4         0.2 setosa
##  2          4.9         3            1.4         0.2 setosa
##  3          4.7         3.2          1.3         0.2 setosa
##  4          4.6         3.1          1.5         0.2 setosa
##  5          5           3.6          1.4         0.2 setosa
##  6          5.4         3.9          1.7         0.4 setosa
##  7          4.6         3.4          1.4         0.3 setosa
##  8          5           3.4          1.5         0.2 setosa
##  9          4.4         2.9          1.4         0.2 setosa
## 10          4.9         3.1          1.5         0.1 setosa
## # ... with 140 more rows

3.9 Regrouper des valeurs : group_by et summarise

Pour travailler par groupe, on peut utiliser group_by. Par exemple si je veux la plus grande valeur de la longueur des sépales par espèce.

## # A tibble: 3 x 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>     
## 1          5.8         4            1.2         0.2 setosa    
## 2          7           3.2          4.7         1.4 versicolor
## 3          7.9         3.8          6.4         2   virginica

Tant qu’on est dans un groupe, les opérations s’y référeront. Il faut donc penser à en sortir avec un ungroup.

Cela nous permet aussi de sommer des valeurs, ou de faire des moyennes.

## # A tibble: 3 x 4
##   Species    moyenne_sepale somme_petale nombre
##   <fct>               <dbl>        <dbl>  <int>
## 1 setosa               5.01         12.3     50
## 2 versicolor           5.94         66.3     50
## 3 virginica            6.59        101.      50

Le count est un raccourci pour summarise(n = n()).

3.10 Joindre des tables : *_join

On peut joindre des tables ayant un identifiant commune avec inner_join, left_join, right_join ou full_join qui fonctionnent comme en SAS.

## # A tibble: 7,500 x 6
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species Petal.Length_2
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>            <dbl>
##  1          5.1         3.5          1.4         0.2 setosa             2.8
##  2          5.1         3.5          1.4         0.2 setosa             2.8
##  3          5.1         3.5          1.4         0.2 setosa             2.6
##  4          5.1         3.5          1.4         0.2 setosa             3  
##  5          5.1         3.5          1.4         0.2 setosa             2.8
##  6          5.1         3.5          1.4         0.2 setosa             3.4
##  7          5.1         3.5          1.4         0.2 setosa             2.8
##  8          5.1         3.5          1.4         0.2 setosa             3  
##  9          5.1         3.5          1.4         0.2 setosa             2.8
## 10          5.1         3.5          1.4         0.2 setosa             3  
## # ... with 7,490 more rows

On a aussi anti_join qui nous donnent les valeurs qui ne sont pas dans la deuxième table.

3.11 Transposer : pivot_*

Ces fonctions servent à transposer en largeur pivot_wider et en longueur pivot_longer. Elles viennent du package tidyr.

## # A tibble: 1 x 150
##   `1`    `2`    `3`    `4`    `5`   `6`   `7`   `8`   `9`   `10`  `11`  `12`  `13`  `14`  `15`  `16`  `17` 
##   <fct>  <fct>  <fct>  <fct>  <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct>
## 1 setosa setosa setosa setosa seto~ seto~ seto~ seto~ seto~ seto~ seto~ seto~ seto~ seto~ seto~ seto~ seto~
## # ... with 133 more variables: `18` <fct>, `19` <fct>, `20` <fct>, `21` <fct>, `22` <fct>, `23` <fct>,
## #   `24` <fct>, `25` <fct>, `26` <fct>, `27` <fct>, `28` <fct>, `29` <fct>, `30` <fct>, `31` <fct>,
## #   `32` <fct>, `33` <fct>, `34` <fct>, `35` <fct>, `36` <fct>, `37` <fct>, `38` <fct>, `39` <fct>,
## #   `40` <fct>, `41` <fct>, `42` <fct>, `43` <fct>, `44` <fct>, `45` <fct>, `46` <fct>, `47` <fct>,
## #   `48` <fct>, `49` <fct>, `50` <fct>, `51` <fct>, `52` <fct>, `53` <fct>, `54` <fct>, `55` <fct>,
## #   `56` <fct>, `57` <fct>, `58` <fct>, `59` <fct>, `60` <fct>, `61` <fct>, `62` <fct>, `63` <fct>,
## #   `64` <fct>, `65` <fct>, `66` <fct>, `67` <fct>, `68` <fct>, `69` <fct>, `70` <fct>, `71` <fct>,
## #   `72` <fct>, `73` <fct>, `74` <fct>, `75` <fct>, `76` <fct>, `77` <fct>, `78` <fct>, `79` <fct>,
## #   `80` <fct>, `81` <fct>, `82` <fct>, `83` <fct>, `84` <fct>, `85` <fct>, `86` <fct>, `87` <fct>,
## #   `88` <fct>, `89` <fct>, `90` <fct>, `91` <fct>, `92` <fct>, `93` <fct>, `94` <fct>, `95` <fct>,
## #   `96` <fct>, `97` <fct>, `98` <fct>, `99` <fct>, `100` <fct>, `101` <fct>, `102` <fct>, `103` <fct>,
## #   `104` <fct>, `105` <fct>, `106` <fct>, `107` <fct>, `108` <fct>, `109` <fct>, `110` <fct>,
## #   `111` <fct>, `112` <fct>, `113` <fct>, `114` <fct>, `115` <fct>, `116` <fct>, `117` <fct>, ...
## # A tibble: 150 x 2
##    name  value 
##    <chr> <fct> 
##  1 1     setosa
##  2 2     setosa
##  3 3     setosa
##  4 4     setosa
##  5 5     setosa
##  6 6     setosa
##  7 7     setosa
##  8 8     setosa
##  9 9     setosa
## 10 10    setosa
## # ... with 140 more rows

3.12 En dehors de dplyr

3.12.1 Discrétiser : cut

Cette fonction permet de découper une valeur numérique en classes. On peut l’utiliser dans un mutate.

## # A tibble: 150 x 6
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_cut
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>   <fct>           
##  1          5.1         3.5          1.4         0.2 setosa  (5,8]           
##  2          4.9         3            1.4         0.2 setosa  (2,5]           
##  3          4.7         3.2          1.3         0.2 setosa  (2,5]           
##  4          4.6         3.1          1.5         0.2 setosa  (2,5]           
##  5          5           3.6          1.4         0.2 setosa  (2,5]           
##  6          5.4         3.9          1.7         0.4 setosa  (5,8]           
##  7          4.6         3.4          1.4         0.3 setosa  (2,5]           
##  8          5           3.4          1.5         0.2 setosa  (2,5]           
##  9          4.4         2.9          1.4         0.2 setosa  (2,5]           
## 10          4.9         3.1          1.5         0.1 setosa  (2,5]           
## # ... with 140 more rows

On lui précise les découpages avec : breaks =, les noms avec labels =. Ces fonctions prennent un vecteur . On conserve la borne inférieure avec include.lowest = TRUE.

3.12.2 Recoder des facteurs : fct_* de forcats

Pour recoder un facteur on utilise fct_collapse si on veut réduire le nombre de niveaux.

## # A tibble: 150 x 6
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species Species_regroup
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>   <fct>          
##  1          5.1         3.5          1.4         0.2 setosa  Autres         
##  2          4.9         3            1.4         0.2 setosa  Autres         
##  3          4.7         3.2          1.3         0.2 setosa  Autres         
##  4          4.6         3.1          1.5         0.2 setosa  Autres         
##  5          5           3.6          1.4         0.2 setosa  Autres         
##  6          5.4         3.9          1.7         0.4 setosa  Autres         
##  7          4.6         3.4          1.4         0.3 setosa  Autres         
##  8          5           3.4          1.5         0.2 setosa  Autres         
##  9          4.4         2.9          1.4         0.2 setosa  Autres         
## 10          4.9         3.1          1.5         0.1 setosa  Autres         
## # ... with 140 more rows

fct_recode est identique mais sans réduction du nombre de niveaux. fct_relevel sert à réordonner les niveaux.