Skip to content

Importer des données en R : chargements rapides, corrects et reproductibles

Problème

Des chargements de fichiers lents et des caractères corrompus font dérailler les analyses avant même qu’elles ne commencent. Les équipes perdent du temps à réécrire le code d’import pour chaque nouveau CSV ou fichier Excel.

Agitation

Des encodages incorrects brouillent le texte non ASCII, les zéros initiaux disparaissent des identifiants, et les gros CSV saturent la mémoire. Chaque ré-exécution érode la confiance dans le jeu de données et retarde la modélisation ou le reporting.

Solution

Utiliser des lecteurs R spécialisés avec un contrôle explicite sur la locale, le délimiteur et les types. Les schémas ci-dessous rendent les imports rapides, stables en types et reproductibles entre machines.

CSV et TSV : valeurs par défaut readr avec locale explicite

library(readr)
 
orders <- read_csv(
  "data/orders.csv",
  locale = locale(encoding = "UTF-8", decimal_mark = ".", grouping_mark = ","),
  col_types = cols(
    order_id = col_character(),
    order_date = col_date(format = "%Y-%m-%d"),
    revenue = col_double(),
    region = col_character()
  )
)
  • Fixer col_types pour empêcher R de deviner des facteurs ou de tronquer les identifiants.
  • Utiliser read_tsv() pour les fichiers tabulés ; read_delim(delim = ";") pour les points-virgules.

Excel : readxl pour xls/xlsx

library(readxl)
 
budget <- read_excel(
  "data/budget.xlsx",
  sheet = "FY24",
  range = "A1:G200",
  col_types = c("text", "numeric", "numeric", "date", "text", "numeric", "numeric")
)
  • readxl ne nécessite pas Java et conserve le format des cellules.
  • Supprimer les lignes d’en-tête avec skip = et ne sélectionner que la plage nécessaire pour gagner en vitesse.

Gros CSV : data.table::fread

library(data.table)
 
clicks <- fread(
  "data/clicks.csv",
  encoding = "UTF-8",
  colClasses = list(character = "user_id"),
  nThread = 4
)
  • Détection automatique du délimiteur ; forcer avec sep = "\t" si besoin.
  • Utiliser select = pour ne charger que les colonnes nécessaires et économiser la mémoire.

Données colonaires et multilingues : arrow

library(arrow)
 
events <- read_parquet("data/events.parquet", as_data_frame = TRUE)
 
# Or stream a large dataset by batches
ds <- open_dataset("s3://bucket/events/")  # works locally on folders, too
events_summary <- ds %>%
  filter(country %in% c("DE", "FR")) %>%
  group_by(country) %>%
  summarise(count = n())
  • Arrow préserve les types et gère l’UTF-8 par défaut.
  • À utiliser pour l’interop avec les moteurs Python/SQL et le filtrage hors mémoire.

Gestion des encodages et des séparateurs

  • Toujours spécifier encoding pour des données multilingues ; privilégier l’UTF-8 de bout en bout.
  • Pour les CSV européens, fixer locale(decimal_mark = ",", grouping_mark = ".").
  • Quand les séparateurs varient, tester une petite lecture : read_delim(..., n_max = 20) pour valider le parsing.

Petit benchmark (1 M de lignes, 8 colonnes, SSD)

LecteurType de fichierTemps de chargement approx.Empreinte mémoireRemarques
data.table::freadCSV~3–4 sFaibleLe plus rapide pour les fichiers plats ; bonne détection des types.
readr::read_csvCSV~6–8 sFaible à moyenneMessages d’erreur clairs ; excellent contrôle de la locale.
arrow::read_parquetParquet~2–3 sFaibleColonnaire ; supporte le filtrage paresseux et les jeux multi-fichiers.
readxl::read_excelXLSX~8–12 sMoyenneIdéal pour les classeurs métiers ; plus lent sur des feuilles très larges.

Les temps varient selon le matériel ; utiliser ce tableau comme indication relative.

Checklist pour des imports reproductibles

  • Figer les types de colonnes avec col_types ou colClasses.
  • Déclarer locale et encoding pour éviter les dérives de caractères cachées.
  • Garder un schéma mince : éliminer les colonnes inutiles dès l’import.
  • Journaliser nrow() et summary() après chaque chargement pour détecter tôt les anomalies.

Guides associés