Lectura de múltiples (excel) archivos en R – Best practice

Tengo cientos de archivos de Excel de tamaño mediano (entre 5000 y 50.0000 filas con alrededor de 100 columnas) para cargarlos en R. Tienen un patrón de nomenclatura bien definido, como x_1.xlsx , x_2.xlsx , etc.

Sé que hay muchas maneras de cargar estos archivos en R como for-loop’s o laspply-type solutions. Por lo tanto, mis preguntas son:

¿Cuál considera que es el mejor enfoque (más rápido, más directo) para leer múltiples archivos?

¿Qué trucos o funciones usas?

Con list.files puede crear una lista de todos los nombres de archivo en su directorio de trabajo. A continuación puede usar lapply para recorrer esa lista y leer cada archivo con la función readxl paquete readxl :

 library(readxl) file.list <- list.files(pattern='*.xlsx') df.list <- lapply(file.list, read_excel) 

Este método también puede usarse con otras funciones de lectura de archivos como read.csv o read.table . Simplemente reemplace read_excel con la función apropiada de lectura de archivos y asegúrese de usar el patrón correcto en list.files .

Si también desea incluir los archivos en subdirectorios, use:

 file.list <- list.files(pattern='*.xlsx', recursive = TRUE) 

Otros posibles paquetes para leer archivos de Excel: openxlsx & xlsx


Suponiendo que las columnas son las mismas para cada archivo, puede unirlas en un dataframe con bind_rows de dplyr :

 library(dplyr) df <- bind_rows(df.list, .id = "id") 

o con rbindlist de data.table :

 library(data.table) df <- rbindlist(df.list, idcol = "id") 

Ambos tienen la opción de agregar una columna de identificación para identificar los conjuntos de datos separados.


Actualización: si no quiere un identificador numérico, simplemente use sapply con simplify = FALSE para leer los archivos en file.list :

 df.list <- sapply(file.list, read.csv, simplify=FALSE) 

Cuando se usa bind_rows de dplyr o rbindlist de data.table , la columna id ahora contiene los nombres de los archivos.

Incluso otro enfoque es usar el paquete 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") 

Otros enfoques para obtener una lista con nombre: si no desea solo un identificador numérico, entonces puede asignar los nombres de archivo a los marcos de datos en la lista antes de vincularlos. Hay varias formas de hacer esto:

 # 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) 

Ahora puede vincular la lista de marcos de datos en un solo rbindlist de datos con rbindlist de data.table o bind_rows de dplyr . La columna de id ahora contendrá los nombres de los archivos en lugar de un identificador numérico.