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.
moi_reveille <- reveil(moi)
moi_douche <- douche(moi_reveille)
moi_habille <- habillage(moi_douche)
moi_dejeuner <- petit_dej(moi_habille)
moi_travail <- partir(moi_dejeuner)
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.
iris %>%
group_by(Species) %>%
summarise(moyenne_sepale = mean(Sepal.Length),
somme_petale = sum(Petal.Width),
nombre = n())
## # 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.
iris2 <- iris %>%
mutate(Petal.Length_2 = Petal.Length * 2) %>%
select(Species, Petal.Length_2)
iris %>%
left_join(iris2, by = c("Species"))
## # 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
.
iris_large <- iris %>%
rowid_to_column() %>%
select(rowid, Species) %>%
pivot_wider(names_from = rowid, values_from = Species)
iris_large
## # 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
.
iris %>%
mutate(Sepal.Length_cut = cut(Sepal.Length,
breaks = c(0, 1, 2, 5, 8, 10),
include.lowest = TRUE))
## # 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.
iris %>%
mutate(Species_regroup = fct_collapse(
Species,
"virginica" = "virginica",
"Autres" = c("setosa", "versicolor")
))
## # 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.