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)
<- read_excel("extdata/ROES_201702.xls", sheet = "AUT_REG",
sitadel 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
<- "https://www.insee.fr/fr/statistiques/fichier/2021703/base-cc-tourisme-2019-geo2019.zip" url
download.file(url, destfile = "extdata/base-cc-tourisme-2019-geo2019.zip")
unzip(zipfile = "extdata/base-cc-tourisme-2019-geo2019.zip", exdir = "extdata")
<- read_excel("extdata/base-cc-tourisme-2019-geo2019.xls",
enq_tourisme 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/
<- "https://www.data.gouv.fr/fr/datasets/r/ed0aa123-6afa-49fe-8e35-797a30a44c43"
url
download.file(url, destfile = "extdata/logements-vacants-du-parc-prive-au-01012021-lovac-.xlsx", mode = "wb")
<- read_xlsx("extdata/logements-vacants-du-parc-prive-au-01012021-lovac-.xlsx", sheet = 1)
lgt_vac_prv
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)
<- "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"
url_urssaf_fr
<- fromJSON(url_urssaf_fr)
reponse_urssaf_fr <- reponse_urssaf_fr$records$fields
urssaf_fr 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
<- paste0("https://opendata.reseaux-energies.fr/api/dataset/1.0/prod-region-annuelle-enr")
dataset_url
<- httr::GET(dataset_url) %>%
metadata ::content("text") %>%
httr::fromJSON(flatten = TRUE)
jsonlite<- metadata$fields
attributs
datatable(attributs)
# Enregistrements
<-"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"
data_url <- jsonlite::fromJSON(data_url)$records$fields prod_annuelle_enr
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.
<- "https://bdm.insee.fr/series/sdmx/data/SERIES_BDM/001564471"
url <- as.data.frame(readSDMX(url))
datainsee # 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.
<- "https://bdm.insee.fr/series/sdmx/data/SERIES_BDM/001564471+001564503+001564799+001564823+001582441+001582578+001582597+001582745+001656155+001656161+001655989+001655995"
url <- as.data.frame(readSDMX(url)) datainsee
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 :
<- "https://bdm.insee.fr/series/sdmx/data/CONSTRUCTION-LOGEMENTS"
url <- as.data.frame(readSDMX(url)) datainsee
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)
<- datasets() %>%
result dido_search("produit-petrolier") %>%
datafiles() %>%
dido_search("drom") %>%
get_data()
::kable(head(result)) knitr
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.
<- st_read(dsn = "extdata", layer = "com_mayotte") Carte_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)
<- st_read(dsn = "extdata/communes2017.geojson") communes2017
## 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 / 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.
::st_drivers() sf
## name
## PCIDSK PCIDSK
## netCDF netCDF
## PDS4 PDS4
## JP2OpenJPEG JP2OpenJPEG
## PDF PDF
## MBTiles MBTiles
## EEDA EEDA
## ESRI Shapefile ESRI Shapefile
## MapInfo File MapInfo File
## UK .NTF UK .NTF
## OGR_SDTS OGR_SDTS
## S57 S57
## DGN DGN
## OGR_VRT OGR_VRT
## REC REC
## Memory Memory
## BNA BNA
## 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
## OGR_DODS OGR_DODS
## ODBC ODBC
## WAsP WAsP
## PGeo PGeo
## MSSQLSpatial MSSQLSpatial
## OGR_OGDI OGR_OGDI
## PostgreSQL PostgreSQL
## MySQL MySQL
## OpenFileGDB OpenFileGDB
## XPlane XPlane
## DXF DXF
## CAD CAD
## Geoconcept Geoconcept
## GeoRSS GeoRSS
## GPSTrackMaker GPSTrackMaker
## VFK VFK
## PGDUMP PGDUMP
## OSM OSM
## GPSBabel GPSBabel
## SUA SUA
## OpenAir OpenAir
## OGR_PDS OGR_PDS
## WFS WFS
## WFS3 WFS3
## SOSI SOSI
## HTF HTF
## AeronavFAA AeronavFAA
## Geomedia Geomedia
## EDIGEO EDIGEO
## GFT GFT
## SVG SVG
## CouchDB CouchDB
## Cloudant Cloudant
## Idrisi Idrisi
## ARCGEN ARCGEN
## SEGUKOOA SEGUKOOA
## SEGY SEGY
## XLS XLS
## ODS ODS
## XLSX XLSX
## ElasticSearch ElasticSearch
## Walk Walk
## Carto Carto
## AmigoCloud AmigoCloud
## SXF SXF
## Selafin Selafin
## JML JML
## PLSCENES PLSCENES
## CSW CSW
## VDV VDV
## GMLAS GMLAS
## MVT MVT
## TIGER TIGER
## AVCBin AVCBin
## AVCE00 AVCE00
## NGW NGW
## HTTP HTTP
## long_name
## PCIDSK PCIDSK Database File
## netCDF Network Common Data Format
## PDS4 NASA Planetary Data System 4
## JP2OpenJPEG JPEG-2000 driver based on OpenJPEG library
## PDF Geospatial PDF
## MBTiles MBTiles
## EEDA Earth Engine Data API
## ESRI Shapefile ESRI Shapefile
## MapInfo File MapInfo File
## UK .NTF UK .NTF
## OGR_SDTS SDTS
## S57 IHO S-57 (ENC)
## DGN Microstation DGN
## OGR_VRT VRT - Virtual Datasource
## REC EPIInfo .REC
## Memory Memory
## BNA Atlas BNA
## 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
## OGR_DODS OGR_DODS
## ODBC 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
## XPlane X-Plane/Flightgear aeronautical data
## DXF AutoCAD DXF
## CAD AutoCAD Driver
## Geoconcept Geoconcept
## GeoRSS GeoRSS
## GPSTrackMaker GPSTrackMaker
## VFK Czech Cadastral Exchange Data Format
## PGDUMP PostgreSQL SQL dump
## OSM OpenStreetMap XML and PBF
## GPSBabel GPSBabel
## SUA Tim Newport-Peace's Special Use Airspace Format
## OpenAir OpenAir
## OGR_PDS Planetary Data Systems TABLE
## WFS OGC WFS (Web Feature Service)
## WFS3 OGC WFS 3 client (Web Feature Service)
## SOSI Norwegian SOSI Standard
## HTF Hydrographic Transfer Vector
## AeronavFAA Aeronav FAA
## Geomedia Geomedia .mdb
## EDIGEO French EDIGEO exchange format
## GFT Google Fusion Tables
## SVG Scalable Vector Graphics
## CouchDB CouchDB / GeoCouch
## Cloudant Cloudant / CouchDB
## Idrisi Idrisi Vector (.vct)
## ARCGEN Arc/Info Generate
## SEGUKOOA SEG-P1 / UKOOA P1/90
## SEGY SEG-Y
## XLS MS Excel format
## ODS Open Document/ LibreOffice / OpenOffice Spreadsheet
## XLSX MS Office Open XML spreadsheet
## ElasticSearch Elastic Search
## Walk Walk
## 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
## TIGER U.S. Census TIGER/Line
## AVCBin Arc/Info Binary Coverage
## AVCE00 Arc/Info E00 (ASCII) Coverage
## NGW NextGIS Web
## HTTP HTTP Fetching Wrapper
## write copy is_raster is_vector vsi
## PCIDSK TRUE FALSE TRUE TRUE TRUE
## netCDF TRUE TRUE TRUE TRUE TRUE
## PDS4 TRUE TRUE TRUE TRUE TRUE
## JP2OpenJPEG FALSE TRUE TRUE TRUE TRUE
## PDF TRUE TRUE TRUE TRUE TRUE
## MBTiles TRUE TRUE TRUE TRUE TRUE
## EEDA FALSE FALSE FALSE TRUE FALSE
## ESRI Shapefile TRUE FALSE FALSE TRUE TRUE
## MapInfo File TRUE FALSE FALSE TRUE TRUE
## UK .NTF 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
## REC FALSE FALSE FALSE TRUE FALSE
## Memory TRUE FALSE FALSE TRUE FALSE
## BNA TRUE FALSE FALSE TRUE TRUE
## 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
## OGR_DODS FALSE FALSE FALSE TRUE FALSE
## ODBC TRUE 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 FALSE FALSE FALSE TRUE TRUE
## XPlane FALSE FALSE FALSE TRUE TRUE
## DXF TRUE FALSE FALSE TRUE TRUE
## CAD FALSE FALSE TRUE TRUE TRUE
## Geoconcept TRUE FALSE FALSE TRUE TRUE
## GeoRSS TRUE FALSE FALSE TRUE TRUE
## GPSTrackMaker 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
## SUA FALSE FALSE FALSE TRUE TRUE
## OpenAir FALSE FALSE FALSE TRUE TRUE
## OGR_PDS FALSE FALSE FALSE TRUE TRUE
## WFS FALSE FALSE FALSE TRUE TRUE
## WFS3 FALSE FALSE FALSE TRUE FALSE
## SOSI FALSE FALSE FALSE TRUE FALSE
## HTF FALSE FALSE FALSE TRUE TRUE
## AeronavFAA FALSE FALSE FALSE TRUE TRUE
## Geomedia FALSE FALSE FALSE TRUE FALSE
## EDIGEO FALSE FALSE FALSE TRUE TRUE
## GFT TRUE FALSE FALSE TRUE FALSE
## SVG FALSE FALSE FALSE TRUE TRUE
## CouchDB TRUE FALSE FALSE TRUE FALSE
## Cloudant TRUE FALSE FALSE TRUE FALSE
## Idrisi FALSE FALSE FALSE TRUE TRUE
## ARCGEN FALSE FALSE FALSE TRUE TRUE
## SEGUKOOA FALSE FALSE FALSE TRUE TRUE
## SEGY 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
## Walk FALSE 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
## TIGER TRUE FALSE FALSE TRUE TRUE
## AVCBin FALSE FALSE FALSE TRUE TRUE
## AVCE00 FALSE FALSE FALSE TRUE TRUE
## NGW TRUE TRUE TRUE TRUE FALSE
## 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 :
<- 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 crte
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
<- dbDriver("PostgreSQL")
drv
#Définition de la base de données
<- dbConnect(drv, dbname = "dbname", host = "ip", port = numero_du_port,
con 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
<- dbGetQuery(con, "SELECT * FROM pesticides.parametre")
parametre
#Téléchargement de données avec dimension spatiale via la fonction st_read du package simple feature
= st_read(con, query = "SELECT * FROM pesticides.station")
station = st_read(dsn = con, layer = c(schema = 'pesticides', table = 'station')) 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 :
::install_gitlab('dreal-datalab/datalibaba')
remoteslibrary(datalibaba)
<- importer_data(table = "parametre", schema = "pesticides")
parametre <- importer_data(table = "station", schema = "pesticides") station
4.5.2 Lire des données sous PostgreSQL : seconde approche
#définition du driver
<- dbDriver("PostgreSQL")
drv
#définition de la base de données
<- dbConnect(drv, dbname = "dbname", host = "ip", port = numero_du_port,
con 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
<- tbl(con, in_schema("pesticides", "analyse")) analyse_db
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 :
<- filter(analyse_db, code_parametre == 1506) analyse_db
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()
<- collect(analyse_db) 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))
<- tempfile()
tf write_parquet(iris, tf)
<- read_parquet(tf, col_select = starts_with("Se"))
df 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.