Manipulation des bases de données dataframe
avec tidyverse et dplyr en langage R
L'essentiel de cette page !
Il existe des librairies dédiées à la manipulation des bases de données rectangulaires (tableaux), au format dataframe.
Grâce à ces librairies tidyverse et dplyr, on va pouvoir fusionner des bases de données en fonction d'une clef ou les remodeler selon plusieurs critères.
0- Prenons un jeu de données qui servira d'exemple
Voici 3 tableaux qui décrivent des personnes, parfois les mêmes (tableau 1 et tableau 3), parfois décrivent les groupes auxquels ils appartiennent (tableau 2).
tab1 <- data.frame(Personne = c("Géraldine","Véronique","Serge","Tom"),
Secteur_loc = c("Qualité","IAB","Qualité","IAB"),
Groupe=c("A1","A2","B1","A1"),
France_loc = c("France","France","France","Grèce"),
age = c(18,19,20,56)
)
tab2 <- data.frame(Groupe =c("A1","A2","B1"),Secteur_loc=c("Bon","Mauvais","Bon"))
tab3 <- data.frame(Secteur_loc = c("Qualité","IAB","IAB","IAB"),
Groupe=c("A1","A2","C1","A1"),
poids = c(70,80,65,53),
taille = c(180,170,160,150)
)
Personne Secteur_loc Groupe France_loc age
1 Géraldine Qualité A1 France 18
2 Véronique IAB A2 France 19
3 Serge Qualité B1 France 20
4 Tom IAB A1 Grèce 56
tableau 1
Groupe Résultat
1 A1 Bon
2 A2 Mauvais
3 B1 Bon
tableau 2
Secteur_loc Groupe poids taille
1 Qualité A1 70 180
2 IAB A2 80 170
3 IAB C1 65 160
4 IAB A1 53 150
tableau 3
1- Extraire les données
Ne pas oublier :
library(dplyr)
Filtrer (extraction de données)
Exemple : extraire les données des individus du groupe A1 du tableau 1.
tab1 %>%
filter(Groupe == "A1")
Personne Secteur_loc Groupe France_loc age
1 Géraldine Qualité A1 France 18
2 Tom IAB A1 Grèce 56
Filtrer les données par un mot clef de colonne
Exemple : extraire les données des personnes et des colonnes finissant par "loc".
tab1 %>%
select(Personne, ends_with("loc"))
Personne Secteur_loc France_loc
1 Géraldine Qualité France
2 Véronique IAB France
3 Serge Qualité France
4 Tom IAB Grèce
Faire des calculs avec mutate()
Extraire les individus et une estimation de leur nombre d'années à travailler :
tab1 %>%
mutate(Personne, retraite = 67 - age) %>%
select(Personne:Groupe, retraite)
Personne Secteur_loc Groupe retraite
1 Géraldine Qualité A1 49
2 Véronique IAB A2 48
3 Serge Qualité B1 47
4 Tom IAB A1 11
Trier les données en fonction d'une variable
Exemple : trier les données en fonction de l'âge :
# arrange,
tab1 %>%
arrange(desc(age))
Personne Secteur_loc Groupe France_loc age
1 Tom IAB A1 Grèce 56
2 Serge Qualité B1 France 20
3 Véronique IAB A2 France 19
4 Géraldine Qualité A1 France 18
2- Grouper les données
Comptabiliser, regrouper les valeurs qui répondent à de même critères
Exemple : grouper les valeurs par secteurs existants. On les comptabilise par secteur et on calcule l'âge moyen (si plusieurs âges inférieurs à 40 ans.
tab1 %>%
group_by(Secteur_loc) %>%
summarise(
n = n(),
age = mean(age, na.rm = TRUE)
) %>%
filter(
n > 1,
age < 40
)
# A tibble: 2 x 3
Secteur_loc n age
<chr> <int> <dbl>
1 IAB 2 37.5
2 Qualité 2 19
3- Combiner les tableaux
Trouver des "matchs" des correspondances entre plusieurs tableaux qui répondent aux même critères.
library("dplyr")
merge(tab1, tab3,
by = c("Secteur_loc","Groupe"))
Secteur_loc Groupe Personne France_loc age poids taille
1 IAB A1 Tom Grèce 56 53 150
2 IAB A2 Véronique France 19 80 170
3 Qualité A1 Géraldine France 18 70 180
Lier les bases de données selon un ou plusieurs critères
left_join(tab1,tab2,by="Groupe")
right_join(tab1,tab2,by="Groupe")
Personne Secteur_loc.x Groupe France_loc age Secteur_loc.y
1 Géraldine Qualité A1 France 18 Usine
2 Véronique IAB A2 France 19 Bureau
3 Serge Qualité B1 France 20 Usine
4 Tom IAB A1 Grèce 56 Usine
full_join(tab1,tab3)
Personne Secteur_loc Groupe France_loc age poids taille
1 Géraldine Qualité A1 France 18 70 180
2 Véronique IAB A2 France 19 80 170
3 Serge Qualité B1 France 20 NA NA
4 Tom IAB A1 Grèce 56 53 150
5 <NA> IAB C1 <NA> NA 65 160
4- Aller plus loin...
Voici un document extrait du web qui résume bien des fonctions essentielles de dplyr.