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_typespour 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")
)readxlne 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
encodingpour 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)
| Lecteur | Type de fichier | Temps de chargement approx. | Empreinte mémoire | Remarques |
|---|---|---|---|---|
data.table::fread | CSV | ~3–4 s | Faible | Le plus rapide pour les fichiers plats ; bonne détection des types. |
readr::read_csv | CSV | ~6–8 s | Faible à moyenne | Messages d’erreur clairs ; excellent contrôle de la locale. |
arrow::read_parquet | Parquet | ~2–3 s | Faible | Colonnaire ; supporte le filtrage paresseux et les jeux multi-fichiers. |
readxl::read_excel | XLSX | ~8–12 s | Moyenne | Idé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_typesoucolClasses. - Déclarer
localeetencodingpour éviter les dérives de caractères cachées. - Garder un schéma mince : éliminer les colonnes inutiles dès l’import.
- Journaliser
nrow()etsummary()après chaque chargement pour détecter tôt les anomalies.
Guides associés
- Transformer après l’import : R dplyr Data Wrangling Pipeline
- Recettes de graphiques rapides : R ggplot2 Quickstart
- Construire manuellement des data frames tidy : How to Create a Dataframe in R