Chapitre 4 Lire des données

La première étape d’une chaîne de traitement est d’accéder aux données à traiter. R propose énormément de solutions pour ce faire. Quelle que soit la solution choisie, l’important est de chercher à rendre votre travail reproductible : c’est à dire reproductible dans le temps et reproductible par un collègue, sur une autre machine. L’idéal est indiquer dans le script de préparation des données comment le fichier est arrivé sur votre poste de travail, soit en codant les instructions de téléchargement, soit en ajoutant des commentaires qui vous permettront plus tard de reconstituer le jeu de données que vous utilisez.

4.1 Lire des fichiers locaux

4.1.1 {readxl} : lire des données Excel

La fonction read_excel() du package {readxl} permet d’importer les données d’un fichier Excel. On peut spécifier :

  • la feuille, les colonnes, les lignes ou la zone à importer,
  • les lignes à supprimer avant importation,
  • si on souhaite importer la première ligne comme des noms de variables ou non,
  • le format des variables importées,
  • la valeur qui sera interprétée comme étant la valeur manquante.
library(readxl)
sitadel <- read_excel("extdata/ROES_201702.xls", sheet = "AUT_REG",
                      col_types = c ("text","text","numeric","numeric","numeric","numeric"))
datatable(sitadel)

4.1.2 read_delim() : lire des fichiers plats

La fonction read_delim() de {readr} permet d’importer les données d’un fichier csv. Elle fonctionne de la même façon que read_excel(). On peut spécifier :

  • le caractère délimiteur de colonne,
  • les lignes à supprimer avant importation,
  • si on souhaite importer la première ligne comme des noms de variables ou non,
  • le locale du fichier,
  • la valeur qui sera interprétée comme étant la valeur manquante.

read_csv(), read_csv2() et read_tsv() sont des implémentations pré-renseignées de read_delim pour lire des fichiers plats avec séparateurs , ; et tabulaire.

4.2 Lire des données disponibles sur le web : téléchargement de fichiers

Parfois, les données que nous exploitons sont disponibles au téléchargement sur le web.

4.2.1 Exemple site de l’INSEE, avec dezippage

Il est possible, directement depuis R, de télécharger ces données et, si nécessaire, de les décompresser (dans le répertoire de travail). Exemple sur les données 2019 de l’enquête INSEE sur les hébergements touristiques.

# présentation des données sur https://www.insee.fr/fr/statistiques/2021703
url <- "https://www.insee.fr/fr/statistiques/fichier/2021703/base-cc-tourisme-2019-geo2019.zip"
download.file(url, destfile = "extdata/base-cc-tourisme-2019-geo2019.zip")
unzip(zipfile = "extdata/base-cc-tourisme-2019-geo2019.zip", exdir = "extdata")
enq_tourisme <- read_excel("extdata/base-cc-tourisme-2019-geo2019.xls", 
                           sheet = "COM", skip = 5)
datatable(head(enq_tourisme), options = list(dom = 't'))

4.2.2 Exemple données sur les logements vacants depuis data.gouv.fr (fichier locvac produit par le CEREMA)

# présentation des données sur https://www.data.gouv.fr/fr/datasets/logements-vacants-du-parc-prive-par-anciennete-de-vacance-par-commune-et-par-epci/
url <- "https://www.data.gouv.fr/api/1/datasets/r/41744167-0321-4e22-8e4f-6974522d5185" 

download.file(url, destfile = "extdata/logements-vacants-du-parc-prive-au-01012021-lovac-.xlsx", mode = "wb")
lgt_vac_prv <- read_xlsx("extdata/logements-vacants-du-parc-prive-au-01012021-lovac-.xlsx", sheet = 5)

datatable(head(lgt_vac_prv), options = list(dom = 't'))

4.3 Lire des données disponibles sur le web via API

De plus en plus de mise à disposition de données, se font via des API (Application Programming Interface). Une API correspond à un protocole de communication entre un logiciel fournisseur et un logiciel utilisateur. L’utilisateur doit suivre une série de méthodes définies par le fournisseur.

Par rapport au téléchargement de fichier via download.file(), on peut ne récupérer qu’une partie du jeu de données. L’autre avantage est la stabilité des url de téléchargement.

En savoir plus sur les API : https://thinkr.fr/les-api-un-enfer/. Connaître les API de l’Etat : https://api.gouv.fr/rechercher-api

Plusieurs solutions sont disponibles pour lire des données au travers d’une API dans R :

  • tester l’API sur votre navigateur, et une fois que l’URL de requête est construite, lire le résultat JSON depuis R -> cf exemple URSSAF
  • utiliser en complément le package {httr} qui simplifie le recours aux API dans R -> exemple ODRE
  • utiliser un package wrapper, c’est à dire ‘enrobant’, dédié à une API spécifique, qui simplifie encore plus l’utilisation de l’API et allège l’écriture -> exemple {Didor} du ministère et {rsdmx} de l’INSEE.

4.3.1 Exemple de recours à l’API opendatasoft en utilisant l’API de l’URSSAF ou de l’ODRE

Opendatasoft est une solution de plateforme opendata comprenant un catalogue, une visualisation des tables, une valorisation graphiques ou cartographiques du jeu de données diffusé et une API d’accès. Cette solution est utilisée par de nombreux acteurs publics (Urssaf, énergéticiens, collectivités, Groupe La Poste…). Chaque partie (catalogue, métadonnées, enregistrements…) fait l’objet d’une URL d’API distincte, en voici deux exemples.

1er exemple données URSSAF des effectifs salariés et de masse salariale du secteur privé par région :

library(jsonlite)

url_urssaf_fr <- "https://open.urssaf.fr/api/records/1.0/search/?dataset=effectifs-salaries-et-masse-salariale-du-secteur-prive-par-region-x-na38&q=&rows=10000&facet=grand_secteur_d_activite&facet=secteur_na28i&facet=annee&facet=trimestre&refine.region=Pays+de+la+Loire"

reponse_urssaf_fr <- fromJSON(url_urssaf_fr)
urssaf_fr <- reponse_urssaf_fr$records$fields
datatable(urssaf_fr)

La récupération des métadonnées d’un jeu de données se fait avec une autre url, en voici un exemple à partir de la plateforme opendata des réseaux d’énergie (ODRE)

# Description du jeu de données
dataset_url  <- paste0("https://opendata.reseaux-energies.fr/api/dataset/1.0/prod-region-annuelle-enr")

metadata <- httr::GET(dataset_url) %>% 
  httr::content("text") %>%
  jsonlite::fromJSON(flatten = TRUE)
attributs <- metadata$fields

datatable(attributs)

# Enregistrements
data_url <-"https://opendata.reseaux-energies.fr/api/records/1.0/search/?dataset=prod-region-annuelle-enr&q=&rows=50&facet=code_insee_region&refine.code_insee_region=52"
prod_annuelle_enr <- jsonlite::fromJSON(data_url)$records$fields

4.3.2 Packages R d’interrogation d’API

Pour faciliter l’utilisation de leur API par les utilisateurs de R, certains fournisseurs propose un package R pour se brancher à leur données. Le support vous propose deux exemples (INSEE et CGDD), mais il en existe de nombreux ! Pour trouver des packages R qui facilitent l’utilisation d’API françaises, rdv sur : https://github.com/frrrenchies/frrrenchies#package-packages-package

4.3.2.1 Lire des données du webservice Insee

L’Insee met à disposition un webservice d’accès (API) à des données de référence sous le format sdmx. Le package {rsdmx} permet de se connecter directement à ces données. Deux approches sont possibles. La première permet d’accéder à une série particulière.

url <- "https://bdm.insee.fr/series/sdmx/data/SERIES_BDM/001564471"
datainsee <- as.data.frame(readSDMX(url))
# Encoding(levels(datainsee$TITLE_FR)) <- "UTF-8"

Cette approche permet également de télécharger plusieurs séries en une seule requête. Par exemple : nous téléchargeons l’ensemble des données sur les créations et défaillances d’entreprises pour les secteurs de la construction et de l’immobilier sur les Pays de la Loire.

url <- "https://bdm.insee.fr/series/sdmx/data/SERIES_BDM/001564471+001564503+001564799+001564823+001582441+001582578+001582597+001582745+001656155+001656161+001655989+001655995"
datainsee <- as.data.frame(readSDMX(url))

L’autre approche permet de télécharger un ensemble de données d’une thématique appelé dataflow. Ici, par exemple, on télécharge l’ensemble des données relatives à la construction neuve :

url <- "https://bdm.insee.fr/series/sdmx/data/CONSTRUCTION-LOGEMENTS"
datainsee <- as.data.frame(readSDMX(url))

4.3.2.2 Interroger le catalogue DiDo du CGDD et lire les jeux de données grâce à {didor}

{didor} est un package R conçu pour explorer et accéder aux données publiées par le SDES au CGDD sur DIDO.

Le package {didor} s’installe depuis GitHub :

install.packages("devtools")
devtools::install_github("mtes-mct/didor")

Voici un exemple d’utilisation pour récupérer les données de consommation de produits pétroliers dans les DROM :

# devtools::install_github("mtes-mct/didor")
library(didor)
library(tidyverse)

result <- datasets() %>%
  dido_search("produit-petrolier") %>%
  datafiles() %>%
  dido_search("drom") %>%
  get_data()
knitr::kable(head(result))

Tutoriel complet : https://mtes-mct.github.io/didor/articles/premiers_pas.html

4.4 Lire des fichiers avec une dimension spatiale

Le package {sf} (pour simple feature) permet d’importer dans R un fichier ayant une dimension spatiale. Après importation, le fichier est un dataframe avec une variable d’un type nouveau : la géométrie. Deux exemples ici pour lire des données au format shape et geojson.

Carte_com_Mayotte <- st_read(dsn = "extdata", layer = "com_mayotte")
## Reading layer `com_mayotte' from data source 
##   `/__w/parcours_r_socle_preparation_des_donnees/parcours_r_socle_preparation_des_donnees/extdata' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 17 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 501990.5 ymin: 8562261 xmax: 532559.5 ymax: 8603052
## Projected CRS: RGM04_UTM_zone_38S
plot(Carte_com_Mayotte)

communes2017 <- st_read(dsn = "extdata/communes2017.geojson")
## Reading layer `communes2017' from data source 
##   `/__w/parcours_r_socle_preparation_des_donnees/parcours_r_socle_preparation_des_donnees/extdata/communes2017.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 1281 features and 10 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 280973 ymin: 6582762 xmax: 545050 ymax: 6834665
## Projected CRS: RGF93 v1 / Lambert-93
plot(communes2017)

Le package {sf} contient l’ensemble des fonctions permettant des manipulations sur fichiers géomatiques. On ne traitera pas ici de toutes ces fonctions en détail, se référer pour cela à la documentation du package ou suivre le module 7 du parcours de formation à R du ministère.

A noter que {sf} étant complètement compatible avec les packages du tidyverse, la géométrie se conçoit comme une donnée comme une autre, sur laquelle par exemple on peut réaliser des agrégations.

On peut également lire des couches directement depuis le web :

st_read("https://france-geojson.gregoiredavid.fr/repo/regions.geojson") %>% 
  filter(code > "10") %>% 
  select(code) %>% 
  plot()

{sf} propose de lire toutes sortes de données spatiales.

sf::st_drivers()
##                          name
## FITS                     FITS
## PCIDSK                 PCIDSK
## netCDF                 netCDF
## PDS4                     PDS4
## VICAR                   VICAR
## JP2OpenJPEG       JP2OpenJPEG
## PDF                       PDF
## MBTiles               MBTiles
## BAG                       BAG
## EEDA                     EEDA
## OGCAPI                 OGCAPI
## ESRI Shapefile ESRI Shapefile
## MapInfo File     MapInfo File
## UK .NTF               UK .NTF
## LVBAG                   LVBAG
## OGR_SDTS             OGR_SDTS
## S57                       S57
## DGN                       DGN
## OGR_VRT               OGR_VRT
## Memory                 Memory
## CSV                       CSV
## NAS                       NAS
## GML                       GML
## GPX                       GPX
## LIBKML                 LIBKML
## KML                       KML
## GeoJSON               GeoJSON
## GeoJSONSeq         GeoJSONSeq
## ESRIJSON             ESRIJSON
## TopoJSON             TopoJSON
## Interlis 1         Interlis 1
## Interlis 2         Interlis 2
## OGR_GMT               OGR_GMT
## GPKG                     GPKG
## SQLite                 SQLite
## ODBC                     ODBC
## WAsP                     WAsP
## PGeo                     PGeo
## MSSQLSpatial     MSSQLSpatial
## OGR_OGDI             OGR_OGDI
## PostgreSQL         PostgreSQL
## MySQL                   MySQL
## OpenFileGDB       OpenFileGDB
## DXF                       DXF
## CAD                       CAD
## FlatGeobuf         FlatGeobuf
## Geoconcept         Geoconcept
## GeoRSS                 GeoRSS
## VFK                       VFK
## PGDUMP                 PGDUMP
## OSM                       OSM
## GPSBabel             GPSBabel
## OGR_PDS               OGR_PDS
## WFS                       WFS
## OAPIF                   OAPIF
## SOSI                     SOSI
## EDIGEO                 EDIGEO
## SVG                       SVG
## Idrisi                 Idrisi
## XLS                       XLS
## ODS                       ODS
## XLSX                     XLSX
## Elasticsearch   Elasticsearch
## Carto                   Carto
## AmigoCloud         AmigoCloud
## SXF                       SXF
## Selafin               Selafin
## JML                       JML
## PLSCENES             PLSCENES
## CSW                       CSW
## VDV                       VDV
## GMLAS                   GMLAS
## MVT                       MVT
## NGW                       NGW
## MapML                   MapML
## GTFS                     GTFS
## PMTiles               PMTiles
## JSONFG                 JSONFG
## TIGER                   TIGER
## AVCBin                 AVCBin
## AVCE00                 AVCE00
## HTTP                     HTTP
##                                                                    long_name
## FITS                                         Flexible Image Transport System
## PCIDSK                                                  PCIDSK Database File
## netCDF                                            Network Common Data Format
## PDS4                                            NASA Planetary Data System 4
## VICAR                                                        MIPL VICAR file
## JP2OpenJPEG                       JPEG-2000 driver based on OpenJPEG library
## PDF                                                           Geospatial PDF
## MBTiles                                                              MBTiles
## BAG                                               Bathymetry Attributed Grid
## EEDA                                                   Earth Engine Data API
## OGCAPI                                                                OGCAPI
## ESRI Shapefile                                                ESRI Shapefile
## MapInfo File                                                    MapInfo File
## UK .NTF                                                              UK .NTF
## LVBAG                                            Kadaster LV BAG Extract 2.0
## OGR_SDTS                                                                SDTS
## S57                                                           IHO S-57 (ENC)
## DGN                                                         Microstation DGN
## OGR_VRT                                             VRT - Virtual Datasource
## Memory                                                                Memory
## CSV                                             Comma Separated Value (.csv)
## NAS                                                              NAS - ALKIS
## GML                                          Geography Markup Language (GML)
## GPX                                                                      GPX
## LIBKML                                      Keyhole Markup Language (LIBKML)
## KML                                            Keyhole Markup Language (KML)
## GeoJSON                                                              GeoJSON
## GeoJSONSeq                                                  GeoJSON Sequence
## ESRIJSON                                                            ESRIJSON
## TopoJSON                                                            TopoJSON
## Interlis 1                                                        Interlis 1
## Interlis 2                                                        Interlis 2
## OGR_GMT                                             GMT ASCII Vectors (.gmt)
## GPKG                                                              GeoPackage
## SQLite                                                   SQLite / Spatialite
## ODBC                                                                        
## WAsP                                                        WAsP .map format
## PGeo                                               ESRI Personal GeoDatabase
## MSSQLSpatial                           Microsoft SQL Server Spatial Database
## OGR_OGDI                                       OGDI Vectors (VPF, VMAP, DCW)
## PostgreSQL                                                PostgreSQL/PostGIS
## MySQL                                                                  MySQL
## OpenFileGDB                                                     ESRI FileGDB
## DXF                                                              AutoCAD DXF
## CAD                                                           AutoCAD Driver
## FlatGeobuf                                                        FlatGeobuf
## Geoconcept                                                        Geoconcept
## GeoRSS                                                                GeoRSS
## VFK                                     Czech Cadastral Exchange Data Format
## PGDUMP                                                   PostgreSQL SQL dump
## OSM                                                OpenStreetMap XML and PBF
## GPSBabel                                                            GPSBabel
## OGR_PDS                                         Planetary Data Systems TABLE
## WFS                                            OGC WFS (Web Feature Service)
## OAPIF                                                     OGC API - Features
## SOSI                                                 Norwegian SOSI Standard
## EDIGEO                                         French EDIGEO exchange format
## SVG                                                 Scalable Vector Graphics
## Idrisi                                                  Idrisi Vector (.vct)
## XLS                                                          MS Excel format
## ODS                     Open Document/ LibreOffice / OpenOffice Spreadsheet 
## XLSX                                          MS Office Open XML spreadsheet
## Elasticsearch                                                 Elastic Search
## Carto                                                                  Carto
## AmigoCloud                                                        AmigoCloud
## SXF                                              Storage and eXchange Format
## Selafin                                                              Selafin
## JML                                                             OpenJUMP JML
## PLSCENES                                              Planet Labs Scenes API
## CSW                                   OGC CSW (Catalog  Service for the Web)
## VDV                                      VDV-451/VDV-452/INTREST Data Format
## GMLAS          Geography Markup Language (GML) driven by application schemas
## MVT                                                      Mapbox Vector Tiles
## NGW                                                              NextGIS Web
## MapML                                                                  MapML
## GTFS                                      General Transit Feed Specification
## PMTiles                                                       ProtoMap Tiles
## JSONFG                                      OGC Features and Geometries JSON
## TIGER                                                 U.S. Census TIGER/Line
## AVCBin                                              Arc/Info Binary Coverage
## AVCE00                                         Arc/Info E00 (ASCII) Coverage
## HTTP                                                   HTTP Fetching Wrapper
##                write  copy is_raster is_vector   vsi
## FITS            TRUE FALSE      TRUE      TRUE FALSE
## PCIDSK          TRUE FALSE      TRUE      TRUE  TRUE
## netCDF          TRUE  TRUE      TRUE      TRUE FALSE
## PDS4            TRUE  TRUE      TRUE      TRUE  TRUE
## VICAR           TRUE  TRUE      TRUE      TRUE  TRUE
## JP2OpenJPEG    FALSE  TRUE      TRUE      TRUE  TRUE
## PDF             TRUE  TRUE      TRUE      TRUE  TRUE
## MBTiles         TRUE  TRUE      TRUE      TRUE  TRUE
## BAG             TRUE  TRUE      TRUE      TRUE  TRUE
## EEDA           FALSE FALSE     FALSE      TRUE FALSE
## OGCAPI         FALSE FALSE      TRUE      TRUE  TRUE
## ESRI Shapefile  TRUE FALSE     FALSE      TRUE  TRUE
## MapInfo File    TRUE FALSE     FALSE      TRUE  TRUE
## UK .NTF        FALSE FALSE     FALSE      TRUE  TRUE
## LVBAG          FALSE FALSE     FALSE      TRUE  TRUE
## OGR_SDTS       FALSE FALSE     FALSE      TRUE  TRUE
## S57             TRUE FALSE     FALSE      TRUE  TRUE
## DGN             TRUE FALSE     FALSE      TRUE  TRUE
## OGR_VRT        FALSE FALSE     FALSE      TRUE  TRUE
## Memory          TRUE FALSE     FALSE      TRUE FALSE
## CSV             TRUE FALSE     FALSE      TRUE  TRUE
## NAS            FALSE FALSE     FALSE      TRUE  TRUE
## GML             TRUE FALSE     FALSE      TRUE  TRUE
## GPX             TRUE FALSE     FALSE      TRUE  TRUE
## LIBKML          TRUE FALSE     FALSE      TRUE  TRUE
## KML             TRUE FALSE     FALSE      TRUE  TRUE
## GeoJSON         TRUE FALSE     FALSE      TRUE  TRUE
## GeoJSONSeq      TRUE FALSE     FALSE      TRUE  TRUE
## ESRIJSON       FALSE FALSE     FALSE      TRUE  TRUE
## TopoJSON       FALSE FALSE     FALSE      TRUE  TRUE
## Interlis 1      TRUE FALSE     FALSE      TRUE  TRUE
## Interlis 2      TRUE FALSE     FALSE      TRUE  TRUE
## OGR_GMT         TRUE FALSE     FALSE      TRUE  TRUE
## GPKG            TRUE  TRUE      TRUE      TRUE  TRUE
## SQLite          TRUE FALSE     FALSE      TRUE  TRUE
## ODBC           FALSE FALSE     FALSE      TRUE FALSE
## WAsP            TRUE FALSE     FALSE      TRUE  TRUE
## PGeo           FALSE FALSE     FALSE      TRUE FALSE
## MSSQLSpatial    TRUE FALSE     FALSE      TRUE FALSE
## OGR_OGDI       FALSE FALSE     FALSE      TRUE FALSE
## PostgreSQL      TRUE FALSE     FALSE      TRUE FALSE
## MySQL           TRUE FALSE     FALSE      TRUE FALSE
## OpenFileGDB     TRUE FALSE      TRUE      TRUE  TRUE
## DXF             TRUE FALSE     FALSE      TRUE  TRUE
## CAD            FALSE FALSE      TRUE      TRUE  TRUE
## FlatGeobuf      TRUE FALSE     FALSE      TRUE  TRUE
## Geoconcept      TRUE FALSE     FALSE      TRUE  TRUE
## GeoRSS          TRUE FALSE     FALSE      TRUE  TRUE
## VFK            FALSE FALSE     FALSE      TRUE FALSE
## PGDUMP          TRUE FALSE     FALSE      TRUE  TRUE
## OSM            FALSE FALSE     FALSE      TRUE  TRUE
## GPSBabel        TRUE FALSE     FALSE      TRUE FALSE
## OGR_PDS        FALSE FALSE     FALSE      TRUE  TRUE
## WFS            FALSE FALSE     FALSE      TRUE  TRUE
## OAPIF          FALSE FALSE     FALSE      TRUE FALSE
## SOSI           FALSE FALSE     FALSE      TRUE FALSE
## EDIGEO         FALSE FALSE     FALSE      TRUE  TRUE
## SVG            FALSE FALSE     FALSE      TRUE  TRUE
## Idrisi         FALSE FALSE     FALSE      TRUE  TRUE
## XLS            FALSE FALSE     FALSE      TRUE FALSE
## ODS             TRUE FALSE     FALSE      TRUE  TRUE
## XLSX            TRUE FALSE     FALSE      TRUE  TRUE
## Elasticsearch   TRUE FALSE     FALSE      TRUE FALSE
## Carto           TRUE FALSE     FALSE      TRUE FALSE
## AmigoCloud      TRUE FALSE     FALSE      TRUE FALSE
## SXF            FALSE FALSE     FALSE      TRUE  TRUE
## Selafin         TRUE FALSE     FALSE      TRUE  TRUE
## JML             TRUE FALSE     FALSE      TRUE  TRUE
## PLSCENES       FALSE FALSE      TRUE      TRUE FALSE
## CSW            FALSE FALSE     FALSE      TRUE FALSE
## VDV             TRUE FALSE     FALSE      TRUE  TRUE
## GMLAS          FALSE  TRUE     FALSE      TRUE  TRUE
## MVT             TRUE FALSE     FALSE      TRUE  TRUE
## NGW             TRUE  TRUE      TRUE      TRUE FALSE
## MapML           TRUE FALSE     FALSE      TRUE  TRUE
## GTFS           FALSE FALSE     FALSE      TRUE  TRUE
## PMTiles         TRUE FALSE     FALSE      TRUE  TRUE
## JSONFG          TRUE FALSE     FALSE      TRUE  TRUE
## TIGER          FALSE FALSE     FALSE      TRUE  TRUE
## AVCBin         FALSE FALSE     FALSE      TRUE  TRUE
## AVCE00         FALSE FALSE     FALSE      TRUE  TRUE
## HTTP           FALSE FALSE      TRUE      TRUE FALSE

Il comprend notamment un driver pour lire les flux WFS, émis par nos plateforme de données géographiques. Voici un exemple issu de SIGloire :

crte <- sf::st_read(dsn = 'https://datacarto.sigloire.fr/wfs?REQUEST=getCapabilities&service=WFS&VERSION=2.0.0', layer = "ms:r_portrait_crte_r52")
crte %>% select(nom_territ) %>% plot

On indique au niveau du paramètre dsn l’url du webservice WFS de la plateforme et au niveau du parametre layer le nom de la couche. Pour aller plus loin dans l’exploitation des flux WFS dans R : https://inbo.github.io/tutorials/tutorials/spatial_wfs_services/.

4.5 Lire des données sous PostgreSQL

Deux approches possibles pour utiliser des données stockées dans une base de données PostgreSQL.

  • Importer toutes ces données dans l’environnement R
  • se connecter à ces données (sans les charger en mémoire vive) et utiliser un interpréteur permettant de traduire du code R comme une requête SQL.

4.5.1 Lire des données sous PostgreSQL : première approche

Le package {DBI} est fréquemment utilisé pour connecter des bases de données à R. On ouvre une connexion en déclarant les informations liées à la base (adresse, identifiants..) et en choisissant le driver de connexion.

#Définition du driver
drv <- dbDriver("PostgreSQL") 

#Définition de la base de données
con <- dbConnect(drv, dbname = "dbname", host = "ip", port = numero_du_port,
                  user = "user_name", password = "pwd") 

#Spécification de l'encodage, obligatoire avec Windows
postgresqlpqExec(con, "SET client_encoding = 'windows-1252'") 

#Téléchargement de la table analyse du schéma pesticide
parametre <- dbGetQuery(con, "SELECT * FROM pesticides.parametre") 

#Téléchargement de données avec dimension spatiale via la fonction st_read du package simple feature
station = st_read(con, query = "SELECT * FROM pesticides.station")
station = st_read(dsn = con, layer = c(schema = 'pesticides', table = 'station'))

On voit que pour importer notre table analyse, on a simplement lancé une requête SQL. Pour obtenir un résultat qui préserve le caractère spatial de notre jeu de données, il faut changer de fonction de lecture.

Un package, encore expérimental, de la DREAL Pays de la Loire, {datalibaba} simplifie l’écriture des instructions de lecture/écriture de données vers ou depuis un SGBD Postgresql/postgis. Il propose de stocker vos identifiants de connexion dans vos variable d’environnement afin d’en préserver la confidentialité et de vous éviter de les réécrire dans chaque script. L’utilisateur n’a plus à se préoccuper du driver de connexion ni de la fonction de lecture. Les instruction précédentes deviennent :

remotes::install_gitlab('dreal-pdl/csd/datalibaba', host = "gitlab-forge.din.developpement-durable.gouv.fr")
library(datalibaba)
parametre <- importer_data(table = "parametre", schema = "pesticides")
station <- importer_data(table = "station", schema = "pesticides")

4.5.2 Lire des données sous PostgreSQL : seconde approche

#définition du driver
drv <- dbDriver("PostgreSQL") 

#définition de la base de données
con <- dbConnect(drv, dbname = "dbname", host = "ip", port = numero_du_port, 
                 user = "user_name", password = "pwd") 

#spécification de l'encodage, obligatoire avec windows
postgresqlpqExec(con, "SET client_encoding = 'windows-1252'") 

#téléchargement de la table analyse du schéma pesticide
analyse_db <- tbl(con, in_schema("pesticides", "analyse"))

Ici la table analyse n’est pas chargée dans l’environnement R, R s’est juste connecté à la base de données.

On peut réaliser des opérations sur la table analyse avec du code R très simplement. Par exemple pour filtrer sur les analyses relatives au Glyphosate :

analyse_db <- filter(analyse_db, code_parametre == 1506)

Attention, ce code ne touche pas la base de donnée, il n’est pas exécuté. Pour l’exécuter, il faut par exemple afficher la table.

analyse_db

Même une fois le code exécuté, cette base n’est pas encore un dataframe. Pour importer la table, on utilise la fonction collect()

analyse_db <- collect(analyse_db)

Cette approche est à conseiller sur d’importantes bases de données, et sans dimension spatiale, car {dbplyr} ne sait pas encore lire facilement ce type de variable.

4.6 Lire des fichiers au format parquet

Apache Parquet est un choix de plus en plus populaire pour le stockage et l’analyse de données. C’est un format binaire optimisé pour réduire la taille des fichiers et offrir une excellente vitesse de lecture, surtout si on souhaite accéder à un jeu de données en ne lisant que quelques colonnes.

Egalement, il est lisible dans de nombreux langages et prévoit, un peu comme avec une base de données PostgreSQL, qu’on exprime une requête de lecture pour limiter la montée des données en RAM au minimum nécessaire.

Enfin on peut grouper les lignes lors un export parquet et réaliser une partition du fichier, par exemple par département ou par région, dans l’idée que certains utilisateurs n’ont pas besoin d’accéder à tout, pour encore accélérer la lecture.

Bref, cela va devenir un must dans la diffusion de données millésimées.

La manière la plus courante de lire et d’écrire des données au format Parquet avec R est d’utiliser le package {Arrow}, et ses les fonctions read_parquet() et write_parquet().

Le package parquetize permet de convertir en masse des jeux de données depuis SAS, Stata, sqlite ou JSON vers parquet.

library(arrow)
datatable(head(iris))
tf <- tempfile()
write_parquet(iris, tf)
df <- read_parquet(tf, col_select = starts_with("Se"))
datatable(head(df))

Pour les données spatiales, le format geoparquet est désormais opérationnel (v1 en décembre 2022). Deux packages ont été développés pour l’utilisation de geoparquet avec R : {sfarrow} sur le CRAN et {geoparquet} en phase de développement actif sur github.

S’il est très efficace pour l’analyse de données, Parquet est en revanche peu adapté à l’ajout de données en continu ou à la modification fréquente de données existantes. Pour cette utilisation, il faut privilégier un système de gestion de base de données comme par exemple PostgreSQL.

Pour en savoir plus sur ce format promis à un bel avenir au ministère : nous vous recommandons la fiche utilitR de l’INSEE dédiée à la question.