Exploitation des bases de données relationnelles avec R

Application avec le Systeme d’Information et de Gestion de l’Education (SIGE) StatEduc

Author

Komlan Nouwokpo Samati

Photo prise https://pixabay.com.

SGBD

Introduction

Développé avec le soutien de l’Institut des Statistiques de l’UNESCO, StatEduc est un outil largement utilisé dans plusieurs pays d’Afrique (Niger, Togo, Cameroun, République Centrafricaine, Burkina Faso, Sénégal, etc.) et d’Europe. StatEduc s’est imposé comme une référence dans la production, la gestion et la diffusion des statistiques de l’éducation en Afrique. J’ai eu l’occasion d’utiliser StatEduc lors de mes précédentes fonctions au Togo et au Niger.

Sur le plan technique, les outils utilisés pour développer les premières versions de StatEduc sont aujourd’hui dépassés (comme PHP, WAMP, etc.). Certains pays ont développé des versions plus modernes avec des technologies plus récentes. Les bases de données ont également évolué, passant de MS Access à PostgreSQL ou SQL Server. Quelle que soit la base de données utilisée, R permet d’accéder aux données de manière simple et efficace.

Dans cet article, nous allons explorer les différentes méthodes pour établir une connexion avec une base de données, en fonction du type de base de données utilisée, et nous verrons comment manipuler les données issues de ces bases.

Pourquoi utiliser R pour se connecter à une base de données

« Parfois, vous pouvez demander à quelqu’un de télécharger un instantané dans un fichier .csv pour vous, mais cela devient rapidement fastidieux : chaque fois que vous aurez besoin d’apporter un changement, vous devrez communiquer avec un autre humain. Vous voulez pouvoir accéder directement à la base de données pour obtenir les données dont vous avez besoin au moment où vous en avez besoin. »
R for Data Science, Hadley Wickham, Mine Cetinkaya-Rundel & Garrett Grolemund

Il y a plusieurs avantages à utiliser R pour se connecter à une base de données. On peut citer entre autres :

  • Vous utilisez R mais ne maîtrisez pas SQL ;
  • Vous souhaitez intégrer les résultats de vos analyses dans un rapport ou un tableau de bord ;
  • Vous voulez que vos résultats soient reproductibles ;
  • Vous déployez les résultats de vos modèles dans une base de données ;
  • Etc.

1. Les packages à utiliser

Les différents packages qui seront utilisés dans cet article sont les suivants :

library(DBI)          # Permet de se connecter à des bases de données
library(odbc)         # Pour se connecter aux bases de données utilisant le pilote ODBC (MS Access, SQL Server, SQLite, etc.)
library(RSQLite)      # Pour se connecter à des bases de données SQLite
library(RPostgres)    # Pour se connecter à PostgreSQL
library(RPostgreSQL)  # Alternative pour PostgreSQL
library(duckdb)       # Pour utiliser DuckDB, une base de données légère et rapide
library(tidyverse)    # Pour la manipulation des données
library(duckplyr)     # Pour une intégration optimale avec DuckDB

2. Connexion à une base de données avec R

Pour se connecter à une base de données avec R, il est nécessaire d’utiliser le package approprié en fonction du type de base de données. Nous allons voir comment établir une connexion avec plusieurs types de bases de données : MS Access, SQLite, DuckDB et PostgreSQL.

«Le package DBI permet de connecter R aux systèmes de gestion de base de données (SGBD). DBI sépare la connectivité au SGBD en un « front-end » et un « back-end ». Le paquetage définit une interface qui est implémentée par les backends DBI tels que : odbc,SQLite,DuckDB, etc.» — Documentation DBI: https://dbi.r-dbi.org/

2.1 Connexion à une base de données MS ACCESS

La base de données par défaut utilisée par StatEduc est MS Access. Plusieurs packages permettent de se connecter à MS Access, mais nous privilégierons odbc, plus facile à utiliser que RODBC.

Voici un exemple d’utilisation du package odbc pour se connecter à une base Access. Notez que le chemin d’accès complet de la base doit être spécifié. Les extensions de MS Access sont .mdb ou .accdb, selon la version utilisée.

con <- dbConnect(
  odbc::odbc(), 
  .connection_string = paste0("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=", 
    "C:/Users/DELL/Desktop/komlan/ds4edu/data/BASE_SIGE.accdb", 
    ";"))
dbDisconnect(con)

Remarque : Le package odbc peut également être utilisé pour se connecter à d’autres bases de données comme SQLite, à condition que les pilotes appropriés soient installés.

2.2 Connexion à une base de données SQLite

Contrairement à MS Access, qui occupe beaucoup d’espace, SQLite est une base de données légère, rapide, autonome et fiable. Elle est intégrée dans de nombreux systèmes, notamment les téléphones portables et les ordinateurs.

Le package RSQLite est couramment utilisé pour se connecter à une base de données SQLite. Les extensions courantes pour SQLite sont .sqlite, .db et .sqlite3.

con <- dbConnect(RSQLite::SQLite(), "data/base_sige.sqlite")
dbDisconnect(con)

2.3 Connexion à une base duckdb

DuckDB est une base de données connue pour sa rapidité et sa simplicité d’utilisation. Elle est portable (la même base peut fonctionner sur plusieurs systèmes d’exploitation) et permet de lire directement plusieurs formats de fichiers, tels que CSV, Parquet, ou des bases de données SQLite.

con <- dbConnect(duckdb::duckdb(), "data/sige_base.db")
dbDisconnect(con)

2.4 Connexion à une base de données PostgreSQL

“PostgreSQL est un puissant système de base de données relationnelle objet open source, développé activement depuis plus de 35 ans, qui lui a valu une solide réputation en termes de fiabilité, de robustesse des fonctionnalités et de performances”. (https://www.postgresql.org/)

C’est une base de données avec assez d’extension comme Postgis qui permet la prise en charge des données géographiques.

2.4.1 En local

Pour se connecter à une base PostgreSQL, il faut fournir les éléments nécessaires:

  • Serveur (host) ;
  • Port (par défaut, 5432) ;
  • Nom d’utilisateur (user) ;
  • Mot de passe (password).
con <- dbConnect(RPostgres::Postgres(),
                 dbname = 'postgres', 
                 host = 'localhost', 
                 port = 5432, 
                 user = 'postgres',
                 password = rstudioapi::askForPassword("Mot de passe"))
dbDisconnect(con)

2.4.2 serveur supabase

Nous avons utilisé le serveur supabase qui héberge une base de données PostgreSQL pour loger les données. Les identifiants nécessaires sont fournis par supabase.

con <- dbConnect(RPostgres::Postgres(),
                 dbname = 'postgres', 
                 host = 'aws-0-eu-west-3.pooler.supabase.com',
                 port = 6543, 
                 user = 'postgres.vriphsmmmayvmqxgmxkd',
                 password = rstudioapi::askForPassword("Mot de passe"))
dbDisconnect(con)

3. Manipuler les tables d’une base de données

Dans cette partie, nous allons nous concentrer sur l’utilisation de la base de données DuckDB pour manipuler les différentes tables.

con <- dbConnect(duckdb::duckdb(), "data/sige_base.db")

3.1 Lister les tables disponibles

Pour lister les tables disponibles dans une base de données, on utilise la fonction dbListTables().

dbListTables(con) |> tibble::tibble()
# A tibble: 136 × 1
   `dbListTables(con)`         
   <chr>                       
 1 AIRE_RECRUTEMENT            
 2 BENEFICIAIRES_OUTILS_BRAILLE
 3 BEPC                        
 4 CANTINE_SOURCE_FINANC       
 5 CAS_VIOLENCE                
 6 CEPD                        
 7 COIN_ETABLISSEEMENT         
 8 DEPENSES                    
 9 DICO_TRADUCTION             
10 DONNEES_FINANC              
# ℹ 126 more rows

3.2 Afficher les champs d’une table

Pour afficher les champs d’une table spécifique, on utilise la fonction dbListFields().

dbListFields(con,"ETABLISSEMENT") |> tibble::tibble()
# A tibble: 25 × 1
   `dbListFields(con, "ETABLISSEMENT")`
   <chr>                               
 1 CODE_ETABLISSEMENT                  
 2 NOM_ETABLISSEMENT                   
 3 CODE_ADMINISTRATIF                  
 4 CODE_TYPE_SYSTEME                   
 5 CODE_TYPE_STATUT_ETAB               
 6 CODE_TYPE_MILIEU                    
 7 CODE_TYPE_SOURCE_FINANC             
 8 DATE_OUVERTURE                      
 9 REFERENCE_CREATION                  
10 NOM_PRENOM_DIRECTEUR                
# ℹ 15 more rows

3.3 Lire une table

Pour lire une table de la base de données, on peut utiliser la fonction dbReadTable(), qui retourne un data.frame.

dbReadTable(con,"ETABLISSEMENT") |> tibble::tibble()
# A tibble: 13,722 × 25
   CODE_ETABLISSEMENT NOM_ETABLISSEMENT     CODE_ADMINISTRATIF CODE_TYPE_SYSTEME
                <dbl> <chr>                 <chr>                          <dbl>
 1            1113001 CEG ADAKPAME          10101C001P                         3
 2            1113002 CEG ADAMAVO           <NA>                               3
 3            1113003 CEG AKODESSEWA        <NA>                               3
 4            1113004 CEG ANFAME            10101C004P                         3
 5            1113005 CEG ATTIEGOU          10101C005P                         3
 6            1113006 CEG AVEPOZO           10101C006P                         3
 7            1113007 CEG BAGUIDA CENTRE    10101C007P                         3
 8            1113008 CEG BAGUIDA PLANTATI… <NA>                               3
 9            1113009 CEG DEVEGO            <NA>                               3
10            1113010 CEG KANYIKOPE         10101C010P                         3
# ℹ 13,712 more rows
# ℹ 21 more variables: CODE_TYPE_STATUT_ETAB <dbl>, CODE_TYPE_MILIEU <dbl>,
#   CODE_TYPE_SOURCE_FINANC <chr>, DATE_OUVERTURE <chr>,
#   REFERENCE_CREATION <chr>, NOM_PRENOM_DIRECTEUR <chr>,
#   TEL_ETABLISSEMENT <chr>, TEL_DIRECTEUR <chr>, DISTANCE_IEPP <dbl>,
#   LATITUDE <dbl>, LONGITUDE <dbl>, NOM_PRENOM_CHEF_INSPECTION <chr>,
#   SEXE_DIRECTEUR <chr>, DIR_OU_INTERIM <chr>, MATRICULE_DIRECTEUR <chr>, …

3.4 Créer une table

La fonction dbCreateTable() permet de créer une table dans une base de données. Par exemple, nous allons importer dans notre base l’estimation de la population scolarisable par tranche d’âge.

pop <- readxl::read_xlsx("data/pop.xlsx")

con |> 
  dbCreateTable(
    name = 'pop',
    fields = pop
  )
dbExistsTable(con, "pop") # TRUE

La fonction dbCreateTable crée les champs de la la table sans les données. On importe les données avec la fonction dbAppendTable.

3.5 Importer des données dans une table

La fonction dbAppendTable() permet d’importer les données dans une table existante.

con |> 
  dbAppendTable(
    name = 'pop',
    value = pop
  )

et dbWriteTable()

con |> 
  dbWriteTable(
    name = 'pop',
    fields = pop
  )
dbExistsTable(con, "pop") # TRUE

3.6 Supprimer une table

La fonction dbRemoveTable() permet de supprimer une table de la base de données.

dbRemoveTable(con, "pop")

4. Elaborer des requêtes à partir de R

Avec R, il est possible d’élaborer des requêtes SQL en utilisant les fonctions dbGetQuery() et dbExecute() du package DBI, ou en utilisant des fonctions dplyr avec le package dbplyr.

4.1 Des Requêtes SQL

Voici un exemple de requête SQL pour sélectionner toutes les données d’une table :

con |> 
  dbGetQuery("SELECT * FROM ETABLISSEMENT") |> 
  tibble::tibble()
# A tibble: 13,722 × 25
   CODE_ETABLISSEMENT NOM_ETABLISSEMENT     CODE_ADMINISTRATIF CODE_TYPE_SYSTEME
                <dbl> <chr>                 <chr>                          <dbl>
 1            1113001 CEG ADAKPAME          10101C001P                         3
 2            1113002 CEG ADAMAVO           <NA>                               3
 3            1113003 CEG AKODESSEWA        <NA>                               3
 4            1113004 CEG ANFAME            10101C004P                         3
 5            1113005 CEG ATTIEGOU          10101C005P                         3
 6            1113006 CEG AVEPOZO           10101C006P                         3
 7            1113007 CEG BAGUIDA CENTRE    10101C007P                         3
 8            1113008 CEG BAGUIDA PLANTATI… <NA>                               3
 9            1113009 CEG DEVEGO            <NA>                               3
10            1113010 CEG KANYIKOPE         10101C010P                         3
# ℹ 13,712 more rows
# ℹ 21 more variables: CODE_TYPE_STATUT_ETAB <dbl>, CODE_TYPE_MILIEU <dbl>,
#   CODE_TYPE_SOURCE_FINANC <chr>, DATE_OUVERTURE <chr>,
#   REFERENCE_CREATION <chr>, NOM_PRENOM_DIRECTEUR <chr>,
#   TEL_ETABLISSEMENT <chr>, TEL_DIRECTEUR <chr>, DISTANCE_IEPP <dbl>,
#   LATITUDE <dbl>, LONGITUDE <dbl>, NOM_PRENOM_CHEF_INSPECTION <chr>,
#   SEXE_DIRECTEUR <chr>, DIR_OU_INTERIM <chr>, MATRICULE_DIRECTEUR <chr>, …

4.2 Des requêtes à partir de dbplyr

Nous allons illustrer cette partie à l’aide d’exercices tirés d’un manuel de formation sur StatEduc.

Exercice 1 : Afficher le code, le nom et le code administratif de tous les établissements

Pour cet exercice, nous avons besoin de la table ETABLISSEMENT qui contient les informations dont le nom et les codes des différents établissements.

tbl(con, "ETABLISSEMENT") |>
  select(CODE_ETABLISSEMENT,NOM_ETABLISSEMENT,CODE_ADMINISTRATIF) 
# Source:   SQL [?? x 3]
# Database: DuckDB v1.1.3 [DELL@Windows 10 x64:R 4.4.1/C:\Users\DELL\Desktop\komlan\base_edu\data\sige_base.db]
   CODE_ETABLISSEMENT NOM_ETABLISSEMENT      CODE_ADMINISTRATIF
                <dbl> <chr>                  <chr>             
 1            1113001 CEG ADAKPAME           10101C001P        
 2            1113002 CEG ADAMAVO            <NA>              
 3            1113003 CEG AKODESSEWA         <NA>              
 4            1113004 CEG ANFAME             10101C004P        
 5            1113005 CEG ATTIEGOU           10101C005P        
 6            1113006 CEG AVEPOZO            10101C006P        
 7            1113007 CEG BAGUIDA CENTRE     10101C007P        
 8            1113008 CEG BAGUIDA PLANTATION <NA>              
 9            1113009 CEG DEVEGO             <NA>              
10            1113010 CEG KANYIKOPE          10101C010P        
# ℹ more rows

Exercice 2: Afficher le code, le nom et la zone de tous les établissements

On aura besoin de la table ETABLISSEMENT et la table TYPE_MILIEU qui contient les libellés du code milieu.

left_join(tbl(con, "ETABLISSEMENT"), 
          tbl(con, "TYPE_MILIEU"),by = join_by(CODE_TYPE_MILIEU)) |> 
  select(CODE_ETABLISSEMENT,NOM_ETABLISSEMENT,LIBELLE_TYPE_MILIEU)
# Source:   SQL [?? x 3]
# Database: DuckDB v1.1.3 [DELL@Windows 10 x64:R 4.4.1/C:\Users\DELL\Desktop\komlan\base_edu\data\sige_base.db]
   CODE_ETABLISSEMENT NOM_ETABLISSEMENT      LIBELLE_TYPE_MILIEU
                <dbl> <chr>                  <chr>              
 1            1113001 CEG ADAKPAME           Urbain             
 2            1113002 CEG ADAMAVO            Urbain             
 3            1113003 CEG AKODESSEWA         Urbain             
 4            1113004 CEG ANFAME             Urbain             
 5            1113005 CEG ATTIEGOU           Urbain             
 6            1113006 CEG AVEPOZO            Urbain             
 7            1113007 CEG BAGUIDA CENTRE     Urbain             
 8            1113008 CEG BAGUIDA PLANTATION Urbain             
 9            1113009 CEG DEVEGO             Rural              
10            1113010 CEG KANYIKOPE          Urbain             
# ℹ more rows

Exercice 3: Afficher les noms de tous les établissements par IEPP et DRE

On aura besoin des tables suivantes:

  • ETABLISSEMENT: les informations sur l’établissement;
  • ETABLISSEMENT_REGROUPEMENT: Les informations sur les regroupements des établissements;
  • REGROUPEMENT: Les types de regroupement;
  • LIAISONS: Les différentes liaisons;
req0 <- left_join(tbl(con, "ETABLISSEMENT") |> 
            select(CODE_ETABLISSEMENT,NOM_ETABLISSEMENT,CODE_ADMINISTRATIF), 
          tbl(con, "ETABLISSEMENT_REGROUPEMENT"),by = join_by(CODE_ETABLISSEMENT)) |>
  right_join(tbl(con, "REGROUPEMENT") |> 
               filter(CODE_TYPE_REGROUPEMENT == 6),by = join_by(CODE_REGROUPEMENT)) |> 
  left_join(tbl(con, "LIAISONS"), by = join_by(CODE_REGROUPEMENT)) |> 
  left_join(tbl(con, "REGROUPEMENT") |> filter(CODE_TYPE_REGROUPEMENT == 5),
            by = join_by(REG_CODE_REGROUPEMENT == CODE_REGROUPEMENT)) |> 
  rename(IEPP = LIBELLE_REGROUPEMENT.x,
         DRE = LIBELLE_REGROUPEMENT.y) |>
  collect()

req0 |>
  select(NOM_ETABLISSEMENT,IEPP,DRE)
# A tibble: 11,082 × 3
   NOM_ETABLISSEMENT   IEPP               DRE           
   <chr>               <chr>              <chr>         
 1 JEP WUITI-ATCHATI   IEPP LOME AEROPORT DRE GOLFE LOME
 2 JEP BE ATTIEGOU     IEPP LOME AEROPORT DRE GOLFE LOME
 3 JEP HOUNTIGOME      IEPP LOME AEROPORT DRE GOLFE LOME
 4 JEP HEDZRANAWOE     IEPP LOME AEROPORT DRE GOLFE LOME
 5 JEE A/D ATSANTI G/A IEPP LOME AEROPORT DRE GOLFE LOME
 6 JEE A/D ATSANTI G/B IEPP LOME AEROPORT DRE GOLFE LOME
 7 JEE BE DAGBUIPE     IEPP LOME AEROPORT DRE GOLFE LOME
 8 JEPL GLORIA         IEPP LOME AEROPORT DRE GOLFE LOME
 9 JEPL SOCRATE        IEPP LOME AEROPORT DRE GOLFE LOME
10 JEPL SAINTE FAMILLE IEPP LOME EST      DRE GOLFE LOME
# ℹ 11,072 more rows

Exercice 4: Afficher les effectifs par sexe des nouveaux inscrits de tous les établissements par IEPP et DRE

On utilise la requête précédente à laquelle on fait une jointure avec la table NOUVEAU_1ERE_ANNEE qui porte sur les effectifs de la premièere année.

req0 |> 
  left_join(tbl(con, "NOUVEAU_1ERE_ANNEE") |> collect(),by = join_by(CODE_ETABLISSEMENT)) |> 
    select(NOM_ETABLISSEMENT,CODE_TYPE_ANNEE,CODE_TYPE_AGE,NB_G_NV_INSCR,NB_F_NV_INSCR,IEPP,DRE) |> 
  rename(Nv_G = NB_G_NV_INSCR,Nv_F = NB_F_NV_INSCR) |> 
  filter(CODE_TYPE_ANNEE == 17)
# A tibble: 20,340 × 7
   NOM_ETABLISSEMENT    CODE_TYPE_ANNEE CODE_TYPE_AGE  Nv_G  Nv_F IEPP     DRE  
   <chr>                          <dbl>         <dbl> <dbl> <dbl> <chr>    <chr>
 1 EPC ATTIEGOU                      17            10     0    10 IEPP LO… DRE …
 2 EPC ATTIEGOU                      17            11     3    10 IEPP LO… DRE …
 3 EPC ATTIEGOU                      17            12    10     0 IEPP LO… DRE …
 4 EPC JEAN PAUL II G/A              17            10     6     5 IEPP LO… DRE …
 5 EPC JEAN PAUL II G/A              17            11     5    18 IEPP LO… DRE …
 6 EPC JEAN PAUL II G/A              17            12     3    12 IEPP LO… DRE …
 7 EPC JEAN PAUL II G/B              17             9     1     0 IEPP LO… DRE …
 8 EPC JEAN PAUL II G/B              17            10     0     1 IEPP LO… DRE …
 9 EPC JEAN PAUL II G/B              17            11     5    11 IEPP LO… DRE …
10 EPC JEAN PAUL II G/B              17            12    18    20 IEPP LO… DRE …
# ℹ 20,330 more rows

Exercice 5: Afficher le nombre d’enseignants par sexe, IEPP et DRE

On aura besoin des tables suivantes:

  • ETABLISSEMENT: Les informations sur les établissements
  • ETAB_ENSEIGNANT_CORPS: Les effectifs des enseignants
  • TYPE_CORPS: Les libellés sur les types de corps enseignants

On crée une première requête pour avoir les effectifs sur le corps enseignants. Ensuite on fait une jointure avec cette requête et la requête de l’exercice 2.

req1 <- left_join(tbl(con, "ETABLISSEMENT"),
          tbl(con,"ETAB_ENSEIGNANT_CORPS"),by = join_by(CODE_ETABLISSEMENT)) |> 
  left_join(tbl(con, "TYPE_CORPS"),by = join_by(CODE_TYPE_CORPS)) |> 
  select(CODE_ETABLISSEMENT,NOM_ETABLISSEMENT,CODE_TYPE_ANNEE,CODE_TYPE_CORPS,NB_HOMME,NB_FEMME,LIBELLE_TYPE_CORPS) |> 
  collect()

req <- req0 |> 
  left_join(req1,by = join_by(CODE_ETABLISSEMENT)) |> 
  filter(CODE_TYPE_ANNEE == 17)

 req |> 
  summarise(Ens_femme = sum(NB_FEMME,na.rm = TRUE),
            Ens_homme = sum(NB_HOMME,na.rm = TRUE),
            .by = c(DRE,IEPP)) |> 
  arrange(DRE)
# A tibble: 61 × 4
   DRE            IEPP                Ens_femme Ens_homme
   <chr>          <chr>                   <dbl>     <dbl>
 1 DRE CENTRALE   IEPP BLITTA OUEST         146       556
 2 DRE CENTRALE   IEPP MO                    80       302
 3 DRE CENTRALE   IEPP SOTOUBOUA NORD       294       517
 4 DRE CENTRALE   IEPP TCHAOUDJO NORD       286       521
 5 DRE CENTRALE   IEPP SOUTOUBOUA SUD       295       418
 6 DRE CENTRALE   IEPP TCHAMBA OUEST        169       589
 7 DRE CENTRALE   IEPP TCHAMBA EST           69       478
 8 DRE CENTRALE   IEPP BLITTA EST           251       564
 9 DRE CENTRALE   IEPP TCHAOUDJO SUD        284       637
10 DRE GOLFE LOME IEPP LOME CENTRE          381       640
# ℹ 51 more rows

Exercice 6: Effectif total des élèves par IEPP et par Région

Les tables dont on aura besoin:

  • EFFECTIF_ELEVE: Informations sur les effectifs des élèves;
  • TYPE_NIVEAU: Informations sur les niveaux d’éducation.

Une première requête pour avoir les effectifs des élèves par niveau, suivi d’une jointure la requête de l’exercice 2.

eff <- left_join(tbl(con, "EFFECTIF_ELEVE"),
           tbl(con,"TYPE_NIVEAU"),by = join_by(CODE_TYPE_NIVEAU )) |>
  filter(CODE_TYPE_ANNEE == 18) |>
  collect()
 
req0 |> 
  left_join(eff,by = join_by(CODE_ETABLISSEMENT)) |> 
  mutate(NB_G_EFF = case_when(is.na(NB_G_EFF) ~ 0, .default = NB_G_EFF),
         NB_F_EFF = case_when(is.na(NB_F_EFF) ~ 0, .default = NB_F_EFF),
         NB_TOTAL =  NB_G_EFF + NB_F_EFF) |> 
  select(IEPP,DRE,NB_TOTAL,LIBELLE_TYPE_NIVEAU) |> 
  filter(!is.na(LIBELLE_TYPE_NIVEAU),LIBELLE_TYPE_NIVEAU != "AUCUN") |> 
  pivot_wider(names_from = LIBELLE_TYPE_NIVEAU, 
              values_from = NB_TOTAL,
              values_fn =  ~ sum(.x, na.rm = TRUE))
# A tibble: 61 × 10
   IEPP        DRE     CM2   CP1   CP2   CE1   CE2   CM1 `Section 1` `Section 2`
   <chr>       <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>       <dbl>       <dbl>
 1 IEPP MO     DRE …  1221  1933  1869  1633  1568  1403         974         771
 2 IEPP BLITT… DRE …  2809  3138  2833  2439  2557  2445        1030        1076
 3 IEPP SOTOU… DRE …  2174  2367  2530  2056  2415  2044        1745        1673
 4 IEPP SOUTO… DRE …  2608  2533  2530  2204  2564  2389        1323        1852
 5 IEPP TCHAO… DRE …  3646  3971  4188  3595  3721  3335        1568        1637
 6 IEPP TCHAM… DRE …  2739  3484  2991  2598  2493  2413         439         400
 7 IEPP TCHAO… DRE …  4846  5275  5132  4833  4681  4718        1374        1378
 8 IEPP TCHAM… DRE …  3080  4370  3924  3409  3290  2997         886        1026
 9 IEPP ASSOLI DRE …  1829  2264  1956  1784  1787  1795         897         820
10 IEPP BASSA… DRE …  1731  3214  2600  2172  2051  2078         736         718
# ℹ 51 more rows
dbDisconnect(con)

Dans cet article, nous avons exploré les différentes méthodes pour se connecter à des bases de données relationnelles avec R, en utilisant des packages comme DBI, odbc, RSQLite, RPostgres, et duckdb. Nous avons également vu comment manipuler les tables et élaborer des requêtes SQL directement depuis R, en utilisant des packages comme dbplyr.

Ces techniques permettent d’intégrer facilement des données provenant de bases de données dans vos analyses et rapports, tout en assurant la reproductibilité et l’automatisation des processus.