Чтение нескольких (excel) файлов в R - Лучшая практика

У меня есть сотни файлов Excel среднего размера (между 5000 и 50.0000 строк с примерно 100 столбцами) для загрузки в R. Они имеют четко определенный шаблон именования, такой как x_1.xlsx, x_2.xlsx и т.д.

Я знаю, что есть много способов загрузить эти файлы в R, например, для решений типа loop или lapply. Следовательно, мои вопросы:

Что вы считаете лучшим (самый быстрый, самый простой) подход к чтению нескольких файлов?

Какие трюки или функции вы используете?

Ответ 1

С помощью list.files вы можете создать список всех имен файлов в вашем рабочем каталоге. Затем вы можете использовать lapply для lapply этого списка и прочитать каждый файл с read_excel функции read_excel из пакета readxl:

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

Этот метод также может использоваться с другими функциями чтения файлов, такими как read.csv или read.table. Просто замените read_excel на соответствующую функцию чтения файлов и убедитесь, что вы используете правильный шаблон в list.files.

Если вы также хотите включить файлы в подкаталоги, используйте:

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

Другие возможные пакеты для чтения Excel файлов: openxlsx & xlsx


Предположим, что столбцы одинаковы для каждого файла, вы можете связать их вместе в одном bind_rows с помощью bind_rows из :

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

или с rbindlist из :

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

Оба имеют возможность добавить id столбца для идентификации отдельных наборов данных.


Обновление. Если вы не хотите использовать числовой идентификатор, просто используйте sapply с simplify = FALSE чтобы прочитать файлы в file.list:

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

При использовании bind_rows из dplyr или rbindlist из data.table столбец id теперь содержит имена файлов.

Еще один подход использует purrr -package:

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

Другие подходы к получению именованного списка: если вы не хотите использовать только числовой идентификатор, вы можете назначить имена файлов в кадры данных в списке, прежде чем связывать их вместе. Есть несколько способов сделать это:

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

Теперь вы можете связать список файлов данных вместе в одном rbindlist с помощью rbindlist из data.table или bind_rows из dplyr. В столбце id теперь будут имена файлов вместо числового идентификатора.