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 DuckDBExploitation des bases de données relationnelles avec R
Application avec le Systeme d’Information et de Gestion de l’Education (SIGE) StatEduc

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 :
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
DBIpermet 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.» — DocumentationDBI: 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") # TRUELa 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") # TRUE3.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 établissementsETAB_ENSEIGNANT_CORPS: Les effectifs des enseignantsTYPE_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.