TIG’R
  • Introduction
  • Modules
  • Données
  • Ressources
  • Crédits
  1. Manipulation
  2. L’écosystème tidyverse
  • Introduction

  • Import de données
    • Toutes les leçons
    • Import & export
    • Web Scraping
  • Manipulation
    • Toutes les leçons
    • Manipulation de tableau
    • L’écosystème tidyverse
  • Statistique
    • Toutes les leçons
    • Statistique Descriptive
    • Classif. Asc. Hiérarch.
  • Graphique
    • Toutes les leçons
    • Graphique R-base
    • Le package ggplot2
    • ggplot2 et la grammaire graphique
  • Réseau
    • Réseau avec igraph
  • Géomatique
    • Toutes les leçons
    • Données vectorielles
    • Données Raster
    • OpenStreetMap & R
  • Cartographie
    • Cartographie mapsf
  • Reproductibilité
    • Toutes les leçons
    • Le package miniCRAN
    • PL et Notebook (Rmd)
    • PL et Notebook (Quarto)

  • Données utilisées
  • Ressources annexes

Sur cette page

  • Objectifs pédagogiques
  • Introduction
    • Installation et chargement du package tidyverse
  • Le pipe
  • Fonctions usuelles
  • La fonction group_by()
  • Pour aller plus loin
  • Exercice

L’ecosystème tidyverse

  • Montrer tout le code
  • Cacher tout le code

  • Voir les sources

Manipulation de données avec les packages du tidyverse

Auteur·rice·s

Justin Dansou

Hugues Pecout

Date de publication

27 juillet 2023

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.

# Installation du package 
install.packages("tidyverse")

# Chargement du package. 
library(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
metaDataDEVAFRICA  <- read.table(file = "data/DEV_AFRICA_2018/afrika_don_meta.csv",
                           header = TRUE,
                           sep= ";",
                           encoding = "UTF-8")


# Import de la base de données DEV_AFRICA_2018
library(readxl)
DevAfrica2018 <- read_excel("data/DEV_AFRICA_2018/afrika_don.xls")

Les fonctions suivantes sont d’usage courant sur les tibbles dans le processus de manipulation des tableaux de données avec le package dplyr:

  1. 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
  1. 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>
  1. 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>
  1. 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>
  1. slice() : permet de sélectionner des lignes d’un tableau de données selon leur position. Elle propose plusieurs variantes dont slice_head() et slice_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’option n. slice_min et slice_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’option n.
# 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:

  1. summarize(): permet de résumer un tableau de données,
DevAfrica2018 %>%
      summarise(popMoyen = mean(POP))
# A tibble: 1 × 1
  popMoyen
     <dbl>
1     26.3
  1. 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 dplyr. 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

  1. slice_sample() : sélection aléatoire d’observation dans une table de données,

  2. relocate() : permet de réordonner les colonnes d’un data frame,

  3. 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,

  4. inner_join() : conserve les lignes communes aux data frame,

  5. semi_join() et anti_join() sont des jointures filtrantes, c’est-à-dire qu’elles sélectionnent les lignes de x sans ajouter les colonnes de y,

  6. left_join(), right_join(),

  7. bind_rows() et bind_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(...)
DevAfrica2018 <- read_excel("...")

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(...(...))


Corrigé

Manipulation de tableau
Toutes les leçons
Code source
---
title: "L'ecosystème `tidyverse`"
subtitle: "Manipulation de données avec les packages du `tidyverse`"
author: 
- Justin Dansou
- Hugues Pecout
date: last-modified
ordre: 02
code-fold: true
code-tools: true
format:
  html:
    theme: cosmo
    code-copy: true
    embed-resources: TRUE
  # pdf:
  #   toc: true
  #   number-sections: true
  #   colorlinks: true
  #   output-file: "import"
  #   output-ext:  "pdf"
---

## 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`.

```{r, warning=FALSE, message=FALSE, eval=FALSE}
#| code-fold: FALSE

# Installation du package 
install.packages("tidyverse")

# Chargement du package. 
library(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`](https://www.tidyverse.org/packages/ "Page web officielle de 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 :

```{r, warning=FALSE, message=FALSE, eval=FALSE}
#| code-fold: FALSE

# Installation du package dplyr 
install.packages("dplyr")


```

Puis charger la librairie pour pouvoir utiliser ses fonctions :

```{r, warning=FALSE, message=FALSE, eval=TRUE}
#| code-fold: FALSE

# Chargement de la librairie
library(dplyr)


```

## Le [*pipe*]{.underline}

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***]{.underline}, 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)**.]{.underline} 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.**

```{r warning=FALSE, eval=FALSE, message=FALSE}
#| code-fold: FALSE


# 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

```{r warning = FALSE, message = FALSE , eval = TRUE}
#| code-fold: FALSE

# Import des métadonnées
metaDataDEVAFRICA  <- read.table(file = "data/DEV_AFRICA_2018/afrika_don_meta.csv",
                           header = TRUE,
                           sep= ";",
                           encoding = "UTF-8")


# Import de la base de données DEV_AFRICA_2018
library(readxl)
DevAfrica2018 <- read_excel("data/DEV_AFRICA_2018/afrika_don.xls")

```

Les fonctions suivantes sont d'usage courant sur les **tibbles** dans le processus de manipulation des tableaux de données avec le package **dplyr**:

1.  **`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](https://tidyselect.r-lib.org/reference/language.html "Site officiel de tidyselect"),

```{r  warning = FALSE, message = FALSE , eval = TRUE}
#| code-fold: FALSE

# Selection de colonnes par nom : sélectionner la liste des pays et leur région d'appartenance 
select(DevAfrica2018, name, SUBREG) 

# Selection de colonnes par position: sélectionner les trois premières colonnes / variable de la base DevAfrica2018
select(DevAfrica2018, 1:3) 

# Selection de colonnes par nom : sélectionner les variables dont le nom commencent par "n" 
select(DevAfrica2018, starts_with("n")) 

```

2.  **`rename()`** : permet de renommer des colonnes.

```{r warning=FALSE, message=FALSE, eval=TRUE}
#| code-fold: FALSE

# Renommer la variable "name" par "NAME" ET
# Renommer la variable "nom"  par "Nom du pays"

DevAfrica2018 %>%
      rename(NAME = name) %>%
      rename('Nom du pays' = nom)

```

3.  **`mutate()`** : permet de modifier ou de créer de nouvelles colonnes en fonction d'autre.s colonne.s.,

```{r warning=FALSE, message=FALSE, eval=TRUE}
#| code-fold: FALSE

# créer une nouvelle variable "Population" contenant la population réelle (a partir de la variable POP)
DevAfrica2018 %>%
     mutate(Population=POP*1000000)

```

4.  **`filter()`** : permet de filtrer ou de sélectionner les lignes d'une table de données en fonction des conditions sur les colonnes,

```{r warning=FALSE, message=FALSE, eval=TRUE}
#| code-fold: FALSE

# Sélectionner les pays dont l'effectif de la population est inférieur à 10 millions d'habitants
DevAfrica2018 %>%
      filter(POP<=10)

```

5.  **`slice()`** : permet de sélectionner des lignes d'un tableau de données selon leur position. Elle propose plusieurs variantes dont **`slice_head()`** et **`slice_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'option **`n`.** **`slice_min`** et **`slice_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'option **`n`**.

```{r}
#| code-fold: FALSE


# Sélectionner la deuxième observation
DevAfrica2018 %>%
         slice(2)

# Sélectionner les dix premières observations
DevAfrica2018 %>%
         slice(1:10)

```

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:

1.  **`summarize()`**: permet de résumer un tableau de données,

```{r warning=FALSE, message=FALSE, eval=TRUE}
#| code-fold: FALSE

DevAfrica2018 %>%
      summarise(popMoyen = mean(POP))

```

2.  **`arrange()`**: réordonne un tableau de données en fonction d'une colonne (variable).

```{r warning=FALSE, message=FALSE, eval=TRUE}
#| code-fold: FALSE


# Trier les pays par ordre alphabétique croissant
DevAfrica2018 %>%
    arrange(desc(nom))


```

## 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***]{.underline}*: 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é.*

```{r warning=FALSE, message=FALSE, eval=TRUE}
#| code-fold: FALSE

# Population moyenne par sous région
DevAfrica2018 %>%
     group_by(SUBREG) %>%
     summarise(popMoyen = mean(POP))

```

## Pour aller plus loin

1.  **`slice_sample()`** : sélection aléatoire d'observation dans une table de données,

2.  **`relocate()`** : permet de réordonner les colonnes d'un data frame,

3.  **`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,

4.  **`inner_join()`** : conserve les lignes communes aux data frame,

5.  **`semi_join()`** et **`anti_join()`** sont des jointures *filtrantes*, c'est-à-dire qu'elles sélectionnent les lignes de **x** sans ajouter les colonnes de **y**,

6.  **`left_join()`**, **`right_join()`,**

7.  **`bind_rows()` et `bind_cols()`**

## <i class="bi bi-person-workspace"></i> Exercice {.title .exo-title}

::: {#exo}
[1. Créez un projet Rstudio]{.question}

*File/New Project/New Directory...*

[2. Téléchargez les données suivantes :]{.question}

|             Intitulé              |                                                                     Téléchargement                                                                      |
|:--------------:|:-----------------------------------------------------:|
| Données pays africains (UN-CEPII) | <a href="https://bit.ly/3DaCAkX" class="btn btn-outline-warning" role="button" aria-disabled="true"><i class="bi bi-cloud-arrow-down"></i> Download</a> |

[3. Placez les données (décompressées) dans le répertoire de votre projet, de la façon suivante :]{.question}

```{r, echo=FALSE, out.width="70%", fig.align='center'}
knitr::include_graphics("../img/folder2.png")
```

[4. Importer la base de données DEV_AFRICA_2018 sous le nom DevAfrica2018.]{.question}

```{r warning = FALSE, message = FALSE , eval = FALSE}
#| code-summary: "Un peu d'aide ?"


# Import des métadonnées
...  <- read.table(file = "...", 
                   header = ...,
                   sep= "...",
                   encoding = "...")


library(...)
DevAfrica2018 <- read_excel("...")

```

[5. Sélectionner la liste des pays et leur région d'appartenance.]{.question}

```{r warning = FALSE, message = FALSE , eval = FALSE}
#| code-summary: "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".]{.question}

```{r warning = FALSE, message = FALSE , eval = FALSE}
#| code-summary: "Un peu d'aide ?"

DevAfrica2018 %>%
    select(...("..."))

```

[7. Quelles sont les variables de la base de données dont le nom contient la lettre "P".]{.question}

```{r warning = FALSE, message = FALSE , eval = FALSE}
#| code-summary: "Un peu d'aide ?"

DevAfrica2018 %>%
   select(...("..."))

```

[8. Renommer la variable "PIB" en "ProduitInterieurBrut".]{.question}

```{r warning = FALSE, message = FALSE , eval = FALSE}
#| code-summary: "Un peu d'aide ?"

DevAfrica2018 %>%
   rename(... = ...)

```

[9. Calculer le taux de dépendance jeune par sous-région.]{.question}

```{r warning = FALSE, message = FALSE , eval = FALSE}
#| code-summary: "Un peu d'aide ?"

DevAfrica2018 %>%
    group_by(...) %>%
    summarise(... = mean(...))

```

[10. Trier les pays par sous-région.]{.question}

```{r warning = FALSE, message = FALSE , eval = FALSE}
#| code-summary: "Un peu d'aide ?"

DevAfrica2018 %>%
   arrange(...(...))

```

------------------------------------------------------------------------

\

::: center
<a href="/correction/tidyverse.zip" class="btn btn-outline-warning" role="button" aria-disabled="true"><i class="bi bi-cloud-arrow-down"></i> Corrigé</a>
:::
:::
 
Ecole d’été CIST·2023 - licensebuttons by-sa - Ouidah, Bénin