# Installation du package
install.packages("tidyverse")
# Chargement du package.
library(tidyverse)
L’ecosystème tidyverse
Manipulation de données avec les packages du tidyverse
Objectifs pédagogiques
L’objectif général de ce module est d’initier les participants à la famille de packages tidyverse
.
Plus spécifiquement, à la fin de ce module, les participants devraient être capables de:
installer et de charger la librairie
tidyverse
,décrire les principales librairies de la famille
tidyverse
,décrire les principales fonctions de la librairie de
tidyverse
dédiée à la manipulation de données (dplyr),manipuler les principales fonctions de dplyr dédiées à la manipulation de données.
Introduction
Le terme tidyvrse vient de tidy (bien ranger ou bien ordonner) et de universe. Il s’agit d’une collection de librairies / extensions aynt une même philolophie de base permettant entre autres, l’importation et l’exportation des données, la manipulation des tableaux de données, la manipulation des collonnes de data frame (variable), le web scrapping, la programmation, etc. Dans ce module nous aborderont les extensions du package tidyverse
permettant la manipulation des données et un peu plus bas celui permettant la visualiation (représentation graphique) des données. soit Le package dplyr propose des fonctions permettant la manipulation des tableaux de données ou data-frames ou plutôt sur une variante appelée tibble. Les tibbles se diffèrent des data.frames à quelques exceptions près. En effet, les lignes d’un tibble n’ont pas de nom (identifiant) et à l’afficharge seules quelques lignes sont retounées.
Installation et chargement du package tidyverse
Les lignes de codes suivantes permettent de faire l’installation et le chargement de tidyverse
.
Les principales librairies (écosystème tidyverse
) automatiquement installées avec tidyverse
sont les suivantes :
readr : import de données,
tibble : exploitation des tableaux de données,
stringr : manipulation des chaînes de caractères,
dplyr : manipulation des données,
tidyr : remise en forme des données,
ggplot2 : visualisation / représentation graphique des données,
forcats : variables qualitatives,
purrr : programmation.
La liste complèle des extensions de tidyverse
se trouve sur le site officiel du tidyverse
.
Note: Ceci étant, au lieu d’installer la collection de packages (tidyverse
), il est aussi possible d’installer directement l’extension souhaité. Par exemple, si l’on souhaite utiliser des fonctions du package dplyr
, vous pouvez uniquement installer ce package de la manière suivante :
# Installation du package dplyr
install.packages("dplyr")
Puis charger la librairie pour pouvoir utiliser ses fonctions :
# Chargement de la librairie
library(dplyr)
Le pipe
La manipulation des tables de données nous amène parfois à envisager l’enchaînement de plusieurs opérations. Par exemple on peut être appeler à faire une sélection, faire des transformations sur la sélection et en fin faire un tri sur le résultat. Pour ce faire, on peut directement imbriquer les fonctions concernées, ceci dans l’ordre inverse de réalisation dans une approche. Ceci rend le code un peu plus difficile à lire et à comprendre (par exemple il est difficile de voir les paramètres de chaque fonction de façon séparée, etc.). La deuxième approche consistera à faire les opérations de façon séparée en stockant les résultats dans des objets en les passant d’une fonction à une autre. En fin, avec le pipe, il possible de réaliser la série d’opérations de manière efficace, claire et compréhensible. Le symbole du pipe est %\>%
ou |> (appelé pipe natif depuis la version 4.1 de R). Le pipe natif est la fois un peu plus rapide et un peu moins flexible/souple comparé au pipe originel (%\>%
). Par exemple avec %\>%
il est possible d’appeler une fonction sans parenthèse, ce qui est impossible avec le pipe natif (|>). La suite d’instructions faisant intervenir plusieurs pipes s’appelle pipeline.
# Sans le pipe la commande suivante permet de sélectionner dans la base DevAfrica2018 trois colonnes (nom, sousregion et population) dont l'effectif de la population est < 10 millions d'habitants
filter(select(DevAfrica2018, nom, SUBREG, POP), POP<=10)
# enchaînement d'opérations sur les fonctions "select" et "filter" a voir ultérieurement
%>%
DevAfrica2018 select(nom, SUBREG, POP) %>%
filter(POP<=10)
# Ce qui équivaut encore à :
|>
DevAfrica2018 select(nom, SUBREG, POP) |>
filter(POP<=10)
Fonctions usuelles
Avant de commencer, importons la base de données d’application
# Import des métadonnées
<- read.table(file = "data/DEV_AFRICA_2018/afrika_don_meta.csv",
metaDataDEVAFRICA header = TRUE,
sep= ";",
encoding = "UTF-8")
# Import de la base de données DEV_AFRICA_2018
library(readxl)
<- read_excel("data/DEV_AFRICA_2018/afrika_don.xls") DevAfrica2018
Les fonctions suivantes sont d’usage courant sur les tibbles dans le processus de manipulation des tableaux de données avec le package dplyr:
select()
: permet de sélectionner les colonnes d’un tableau de données par leur nom ou pour leur position (numéro de colonne). Elle comprend une série de fonctions facilitant la sélection de colonnes multiples. Les fonctions stars_with(), ends_width(), contains() ou matches() permettent de spécifier des conditions sur les noms de variables. La liste exhaustive des possibilités offertes par select() est disponible dans la documentation de l’extension tidyselect Ici,
# Selection de colonnes par nom : sélectionner la liste des pays et leur région d'appartenance
select(DevAfrica2018, name, SUBREG)
# A tibble: 49 × 2
name SUBREG
<chr> <chr>
1 Angola Middle Africa
2 Burundi Eastern Africa
3 Benin Western Africa
4 Burkina Faso Western Africa
5 Botswana Southern Africa
6 Central African Rep. Middle Africa
7 Côte d'Ivoire Western Africa
8 Cameroon Middle Africa
9 Dem. Rep. Congo Middle Africa
10 Congo Middle Africa
# ℹ 39 more rows
# Selection de colonnes par position: sélectionner les trois premières colonnes / variable de la base DevAfrica2018
select(DevAfrica2018, 1:3)
# A tibble: 49 × 3
iso3 name nom
<chr> <chr> <chr>
1 AGO Angola Angola
2 BDI Burundi Burundi
3 BEN Benin Bénin
4 BFA Burkina Faso Burkina Faso
5 BWA Botswana Botswana
6 CAF Central African Rep. Rep. Centrafricaine
7 CIV Côte d'Ivoire Côte d'Ivoire
8 CMR Cameroon Cameroun
9 COD Dem. Rep. Congo Congo, Rép. dém. du
10 COG Congo Congo
# ℹ 39 more rows
# Selection de colonnes par nom : sélectionner les variables dont le nom commencent par "n"
select(DevAfrica2018, starts_with("n"))
# A tibble: 49 × 2
name nom
<chr> <chr>
1 Angola Angola
2 Burundi Burundi
3 Benin Bénin
4 Burkina Faso Burkina Faso
5 Botswana Botswana
6 Central African Rep. Rep. Centrafricaine
7 Côte d'Ivoire Côte d'Ivoire
8 Cameroon Cameroun
9 Dem. Rep. Congo Congo, Rép. dém. du
10 Congo Congo
# ℹ 39 more rows
rename()
: permet de renommer des colonnes.
# Renommer la variable "name" par "NAME" ET
# Renommer la variable "nom" par "Nom du pays"
%>%
DevAfrica2018 rename(NAME = name) %>%
rename('Nom du pays' = nom)
# A tibble: 49 × 26
iso3 NAME `Nom du pays` POP PIB IDH ADOFEC CO2HAB EMPAGR EMPSER
<chr> <chr> <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 AGO Angola Angola 31.3 6793… 0.58… 153. 1.12 50.4 41.4
2 BDI Burundi Burundi 11.4 756.… 0.432 56.2 0.0467 92.0 6.50
3 BEN Benin Bénin 11.6 3224… 0.54… 87.4 0.622 38.9 42.1
4 BFA Burkina Fa… Burkina Faso 20.0 2160… 0.44… 106. 0.197 25.6 40.9
5 BWA Botswana Botswana 2.28 1770… 0.73… 46.3 2.96 20.9 61.0
6 CAF Central Af… Rep. Centraf… 4.71 938.… 0.39… 130. 0.0651 77.4 17.2
7 CIV Côte d'Ivo… Côte d'Ivoire 25.4 5133… 0.53… 118. 0.335 40.5 46.5
8 CMR Cameroon Cameroun 25.5 3628… 0.56… 108. 0.323 43.8 41.4
9 COD Dem. Rep. … Congo, Rép. … 85.4 1091… 0.47… 125. 0.0242 65.6 24.7
10 COG Congo Congo 5.31 3356… 0.57… 113. 0.616 34.4 43.7
# ℹ 39 more rows
# ℹ 16 more variables: INTERN <dbl>, ESPVIE <dbl>, AGEMED <dbl>, TELMOB <dbl>,
# MORINF <dbl>, TXMIGR <dbl>, DVIEUX <dbl>, TUBERC <dbl>, URBANI <dbl>,
# DJEUNE <dbl>, SUBREG <chr>, LOCKED <dbl>, COLFRA <dbl>, COLGBR <dbl>,
# LANGFR <dbl>, LANGEN <dbl>
mutate()
: permet de modifier ou de créer de nouvelles colonnes en fonction d’autre.s colonne.s.,
# créer une nouvelle variable "Population" contenant la population réelle (a partir de la variable POP)
%>%
DevAfrica2018 mutate(Population=POP*1000000)
# A tibble: 49 × 27
iso3 name nom POP PIB IDH ADOFEC CO2HAB EMPAGR EMPSER INTERN ESPVIE
<chr> <chr> <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 AGO Ango… Ango… 31.3 6793… 0.58… 153. 1.12 50.4 41.4 14.3 61.0
2 BDI Buru… Buru… 11.4 756.… 0.432 56.2 0.0467 92.0 6.50 2.66 61.4
3 BEN Benin Bénin 11.6 3224… 0.54… 87.4 0.622 38.9 42.1 20 61.6
4 BFA Burk… Burk… 20.0 2160… 0.44… 106. 0.197 25.6 40.9 16 61.4
5 BWA Bots… Bots… 2.28 1770… 0.73… 46.3 2.96 20.9 61.0 47 69.4
6 CAF Cent… Rep.… 4.71 938.… 0.39… 130. 0.0651 77.4 17.2 4.34 53.0
7 CIV Côte… Côte… 25.4 5133… 0.53… 118. 0.335 40.5 46.5 46.8 57.6
8 CMR Came… Came… 25.5 3628… 0.56… 108. 0.323 43.8 41.4 23.2 59.1
9 COD Dem.… Cong… 85.4 1091… 0.47… 125. 0.0242 65.6 24.7 8.62 60.5
10 COG Congo Congo 5.31 3356… 0.57… 113. 0.616 34.4 43.7 8.65 64.4
# ℹ 39 more rows
# ℹ 15 more variables: AGEMED <dbl>, TELMOB <dbl>, MORINF <dbl>, TXMIGR <dbl>,
# DVIEUX <dbl>, TUBERC <dbl>, URBANI <dbl>, DJEUNE <dbl>, SUBREG <chr>,
# LOCKED <dbl>, COLFRA <dbl>, COLGBR <dbl>, LANGFR <dbl>, LANGEN <dbl>,
# Population <dbl>
filter()
: permet de filtrer ou de sélectionner les lignes d’une table de données en fonction des conditions sur les colonnes,
# Sélectionner les pays dont l'effectif de la population est inférieur à 10 millions d'habitants
%>%
DevAfrica2018 filter(POP<=10)
# A tibble: 17 × 26
iso3 name nom POP PIB IDH ADOFEC CO2HAB EMPAGR EMPSER INTERN ESPVIE
<chr> <chr> <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 BWA Bots… Bots… 2.28 1770… 0.73… 46.3 2.96 20.9 61.0 47 69.4
2 CAF Cent… Rep.… 4.71 938.… 0.39… 130. 0.0651 77.4 17.2 4.34 53.0
3 COG Congo Congo 5.31 3356… 0.57… 113. 0.616 34.4 43.7 8.65 64.4
4 DJI Djib… Djib… 0.966 5366… 0.52… 19.2 0.672 33.5 53.5 55.7 66.8
5 ERI Erit… Eryt… 3.47 NA 0.45… 53.5 0.214 61.4 30.1 1.31 66.1
6 GAB Gabon Gabon 2.15 1480… 0.69… 97.5 2.53 33.1 56.2 62 66.3
7 GMB Gamb… Gamb… 2.31 2175… 0.49… 79.8 0.268 27.4 56.9 19.8 61.9
8 GNB Guin… Guin… 1.90 1969… 0.47… 105. 0.181 68.3 24.7 3.93 58.2
9 GNQ Eq. … Guin… 1.33 1945… 0.58… 157. 4.34 42.2 38.3 26.2 58.6
10 LBR Libe… Libé… 4.88 1462… 0.47… 136. 0.323 43.4 46.3 7.98 63.9
11 LBY Libya Libye 6.73 1509… 0.72… 5.81 8.09 18.7 58.9 21.8 72.8
12 LSO Leso… Leso… 2.12 2758… 0.52… 92.3 1.26 8.66 49.1 29 54.0
13 MRT Maur… Maur… 4.46 5119… 0.54… 72.0 0.604 51.7 35.5 20.8 64.8
14 NAM Nami… Nami… 2.47 9784… 0.64… 65.5 1.75 22.4 61.4 51 63.5
15 SLE Sier… Sier… 7.73 1690… 0.44… 115. 0.141 55.2 38.4 9 54.5
16 SWZ Swaz… Swaz… 1.14 8647… 0.60… 77.1 1.05 12.6 63.5 47 59.8
17 TGO Togo Togo 7.99 1574… 0.51… 89.4 0.433 38.0 49.1 12.4 60.9
# ℹ 14 more variables: AGEMED <dbl>, TELMOB <dbl>, MORINF <dbl>, TXMIGR <dbl>,
# DVIEUX <dbl>, TUBERC <dbl>, URBANI <dbl>, DJEUNE <dbl>, SUBREG <chr>,
# LOCKED <dbl>, COLFRA <dbl>, COLGBR <dbl>, LANGFR <dbl>, LANGEN <dbl>
slice()
: permet de sélectionner des lignes d’un tableau de données selon leur position. Elle propose plusieurs variantes dontslice_head()
etslice_tail()
permettant respectivement de sélectionner les premières ou les dernières observations d’un tableaux de données en précisant le nombre via l’optionn
.slice_min
etslice_max
permettent de sélectionner les lignes présentant les plus faibles ou plus fortes valeurs. Lorsque plusieurs lignes répondent au critère, on spécifier le nombre retourné avec l’optionn
.
# Sélectionner la deuxième observation
%>%
DevAfrica2018 slice(2)
# A tibble: 1 × 26
iso3 name nom POP PIB IDH ADOFEC CO2HAB EMPAGR EMPSER INTERN ESPVIE
<chr> <chr> <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 BDI Burun… Buru… 11.4 756.… 0.432 56.2 0.0467 92.0 6.50 2.66 61.4
# ℹ 14 more variables: AGEMED <dbl>, TELMOB <dbl>, MORINF <dbl>, TXMIGR <dbl>,
# DVIEUX <dbl>, TUBERC <dbl>, URBANI <dbl>, DJEUNE <dbl>, SUBREG <chr>,
# LOCKED <dbl>, COLFRA <dbl>, COLGBR <dbl>, LANGFR <dbl>, LANGEN <dbl>
# Sélectionner les dix premières observations
%>%
DevAfrica2018 slice(1:10)
# A tibble: 10 × 26
iso3 name nom POP PIB IDH ADOFEC CO2HAB EMPAGR EMPSER INTERN ESPVIE
<chr> <chr> <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 AGO Ango… Ango… 31.3 6793… 0.58… 153. 1.12 50.4 41.4 14.3 61.0
2 BDI Buru… Buru… 11.4 756.… 0.432 56.2 0.0467 92.0 6.50 2.66 61.4
3 BEN Benin Bénin 11.6 3224… 0.54… 87.4 0.622 38.9 42.1 20 61.6
4 BFA Burk… Burk… 20.0 2160… 0.44… 106. 0.197 25.6 40.9 16 61.4
5 BWA Bots… Bots… 2.28 1770… 0.73… 46.3 2.96 20.9 61.0 47 69.4
6 CAF Cent… Rep.… 4.71 938.… 0.39… 130. 0.0651 77.4 17.2 4.34 53.0
7 CIV Côte… Côte… 25.4 5133… 0.53… 118. 0.335 40.5 46.5 46.8 57.6
8 CMR Came… Came… 25.5 3628… 0.56… 108. 0.323 43.8 41.4 23.2 59.1
9 COD Dem.… Cong… 85.4 1091… 0.47… 125. 0.0242 65.6 24.7 8.62 60.5
10 COG Congo Congo 5.31 3356… 0.57… 113. 0.616 34.4 43.7 8.65 64.4
# ℹ 14 more variables: AGEMED <dbl>, TELMOB <dbl>, MORINF <dbl>, TXMIGR <dbl>,
# DVIEUX <dbl>, TUBERC <dbl>, URBANI <dbl>, DJEUNE <dbl>, SUBREG <chr>,
# LOCKED <dbl>, COLFRA <dbl>, COLGBR <dbl>, LANGFR <dbl>, LANGEN <dbl>
En plus de ces fonctions, on a deux autres qui sont généralement applicables aux tableaux de données elles-mêmes. Il s’agit de:
summarize()
: permet de résumer un tableau de données,
%>%
DevAfrica2018 summarise(popMoyen = mean(POP))
# A tibble: 1 × 1
popMoyen
<dbl>
1 26.3
arrange()
: réordonne un tableau de données en fonction d’une colonne (variable).
# Trier les pays par ordre alphabétique croissant
%>%
DevAfrica2018 arrange(desc(nom))
# A tibble: 49 × 26
iso3 name nom POP PIB IDH ADOFEC CO2HAB EMPAGR EMPSER INTERN ESPVIE
<chr> <chr> <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 ZWE Zimb… Zimb… 14.5 2982… 0.56… 89.0 0.849 66.4 26.8 27.1 61.3
2 ZMB Zamb… Zamb… 17.6 3500… 0.58… 122. 0.301 49.0 40.1 14.3 63.7
3 TUN Tuni… Tuni… 11.6 1075… 0.73… 7.81 2.73 13.2 54.2 64.2 76.6
4 TGO Togo Togo 7.99 1574… 0.51… 89.4 0.433 38.0 49.1 12.4 60.9
5 TCD Chad Tchad 15.7 1577… 0.39… 163. 0.0655 76.6 21.2 6.5 54.1
6 TZA Tanz… Tanz… 57.2 2625… 0.52… 119. 0.222 65.5 27.7 25 65.2
7 SEN Sene… Séné… 16.1 3354… 0.51… 74.1 0.739 30.4 56.2 46 67.8
8 SWZ Swaz… Swaz… 1.14 8647… 0.60… 77.1 1.05 12.6 63.5 47 59.8
9 SSD S. S… Sud … 11.0 NA 0.43… 64.0 0.170 57.3 29.0 7.98 57.7
10 SDN Sudan Soud… 42.3 4059… 0.50… 66.0 0.503 40.0 43.5 30.9 65.2
# ℹ 39 more rows
# ℹ 14 more variables: AGEMED <dbl>, TELMOB <dbl>, MORINF <dbl>, TXMIGR <dbl>,
# DVIEUX <dbl>, TUBERC <dbl>, URBANI <dbl>, DJEUNE <dbl>, SUBREG <chr>,
# LOCKED <dbl>, COLFRA <dbl>, COLGBR <dbl>, LANGFR <dbl>, LANGEN <dbl>
La fonction group_by()
La clause group_by()
est aussi l’une des fonctions d’usage courant et utile de dply
r. Elle permet de définir des groupes de lignes à partir des valeurs d’une ou plusieurs colonnes. Par exemple, on peut regroupe la population d’un pays par un certain niveau de découpage administratif. L’usage courant est d’effectuer des opérations sur les groupes constitués par la fonction group_by() en faisant appel à d’autres fonctions, par exemple slice()
, mutate()
ou summarise()
. L’argument n()
de summarise()
appliqué à un group_by()
permet d’obtenir les effectifs par groupe.
Il est aussi possible de grouper selon plusieurs colonnes / variables en les indiquant dans la clause du group_by()
.
Note: la clause group_by()
marche avec la plus part des fonctions à l’exception de arrange()
qui s’applique par défaut à l’ensemble du tableau de données. Pour avoir un tri par groupe, un argument suplémentaire .by_group = TRUE
doit être utilisé.
# Population moyenne par sous région
%>%
DevAfrica2018 group_by(SUBREG) %>%
summarise(popMoyen = mean(POP))
# A tibble: 5 × 2
SUBREG popMoyen
<chr> <dbl>
1 Eastern Africa 28.3
2 Middle Africa 21.4
3 Northern Africa 39.8
4 Southern Africa 13.2
5 Western Africa 25.7
Pour aller plus loin
slice_sample()
: sélection aléatoire d’observation dans une table de données,relocate()
: permet de réordonner les colonnes d’un data frame,full_join()
: toutes les lignes des tableaux de données en fusion sont conversées et les NA sont générées si nécessaire,inner_join()
: conserve les lignes communes aux data frame,semi_join()
etanti_join()
sont des jointures filtrantes, c’est-à-dire qu’elles sélectionnent les lignes de x sans ajouter les colonnes de y,left_join()
,right_join()
,bind_rows()
etbind_cols()
Exercice
1. Créez un projet Rstudio
File/New Project/New Directory…
2. Téléchargez les données suivantes :
Intitulé | Téléchargement |
---|---|
Données pays africains (UN-CEPII) | Download |
3. Placez les données (décompressées) dans le répertoire de votre projet, de la façon suivante :
4. Importer la base de données DEV_AFRICA_2018 sous le nom DevAfrica2018.
Un peu d’aide ?
# Import des métadonnées
<- read.table(file = "...",
... header = ...,
sep= "...",
encoding = "...")
library(...)
<- read_excel("...") DevAfrica2018
5. Sélectionner la liste des pays et leur région d’appartenance.
Un peu d’aide ?
%>%
DevAfrica2018 select(..., ...)
6. Quelles sont les variables de la base de données dont le nom commence par la lettre “P”.
Un peu d’aide ?
%>%
DevAfrica2018 select(...("..."))
7. Quelles sont les variables de la base de données dont le nom contient la lettre “P”.
Un peu d’aide ?
%>%
DevAfrica2018 select(...("..."))
8. Renommer la variable “PIB” en “ProduitInterieurBrut”.
Un peu d’aide ?
%>%
DevAfrica2018 rename(... = ...)
9. Calculer le taux de dépendance jeune par sous-région.
Un peu d’aide ?
%>%
DevAfrica2018 group_by(...) %>%
summarise(... = mean(...))
10. Trier les pays par sous-région.
Un peu d’aide ?
%>%
DevAfrica2018 arrange(...(...))