J'ai des centaines de fichiers Excel de taille moyenne (entre 5 000 et 50 000 lignes avec environ 100 colonnes) à charger dans R. Ils ont un modèle de dénomination bien défini, comme x_1.xlsx
, x_2.xlsx
, etc.
Comment puis-je charger ces fichiers dans R de la manière la plus rapide et la plus simple?
Avec list.files
vous pouvez créer une liste de tous les noms de fichiers dans votre répertoire de travail. Ensuite, vous pouvez utiliser lapply
pour parcourir cette liste et lire chaque fichier avec le read_Excel
fonction du package readxl
:
library(readxl)
file.list <- list.files(pattern='*.xlsx')
df.list <- lapply(file.list, read_Excel)
Cette méthode peut bien sûr également être utilisée avec d'autres fonctions de lecture de fichiers comme read.csv
ou read.table
. Remplacez simplement read_Excel
avec la fonction de lecture de fichier appropriée et assurez-vous d'utiliser le bon modèle dans list.files
.
Si vous souhaitez également inclure les fichiers dans des sous-répertoires, utilisez:
file.list <- list.files(pattern='*.xlsx', recursive = TRUE)
Autres packages possibles pour la lecture de fichiers Excel: openxlsx & xlsx
En supposant que les colonnes sont les mêmes pour chaque fichier, vous pouvez les lier ensemble dans une même trame de données avec bind_rows
de dplyr :
library(dplyr)
df <- bind_rows(df.list, .id = "id")
ou avec rbindlist
de data.table :
library(data.table)
df <- rbindlist(df.list, idcol = "id")
Les deux ont la possibilité d'ajouter une colonne id
pour identifier les ensembles de données distincts.
Mise à jour: Si vous ne voulez pas d'identifiant numérique, utilisez simplement sapply
avec simplify = FALSE
pour lire les fichiers dans file.list
:
df.list <- sapply(file.list, read.csv, simplify=FALSE)
Lors de l'utilisation de bind_rows
from dplyr or rbindlist
from data.table, la colonne id
contient désormais les noms de fichiers.
Une autre approche encore utilise le package purrr
-:
library(purrr)
file.list <- list.files(pattern='*.csv')
file.list <- setNames(file.list, file.list) # only needed when you need an id-column with the file-names
df <- map_df(file.list, read.csv, .id = "id")
Autres approches pour obtenir une liste nommée: Si vous ne voulez pas seulement un identifiant numérique, vous pouvez attribuer les noms de fichiers aux cadres de données dans la liste avant vous les liez ensemble. Il y a plusieurs moyens de le faire:
# with the 'attr' function from base R
attr(df.list, "names") <- file.list
# with the 'names' function from base R
names(df.list) <- file.list
# with the 'setattr' function from the 'data.table' package
setattr(df.list, "names", file.list)
Vous pouvez maintenant lier la liste des trames de données dans une même trame de données avec rbindlist
de data.table ou bind_rows
de dplyr. La colonne id
contiendra désormais les noms de fichiers au lieu d'un identificateur numérique.