web-dev-qa-db-fra.com

Comment puis-je lire plusieurs fichiers (Excel) dans R?

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?

29
Manuel R

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.

66
Jaap