Для нескольких листов в нескольких файлах Excel требуется вложенный цикл. Рассмотрим вложенные lapply
звонки. В частности, вернуть соответствующий объект, так как прямо сейчас он возвращает листов для каждого вызова функции. Затем преобразуйте for
в lapply
для списка объектов:
# load names of excel files
files = list.files(path = "...", full.names = TRUE, pattern = ".xlsx")
# create function to read multiple sheets per excel file
read_excel_allsheets <- function(filename, tibble = FALSE) {
sheets <- readxl::excel_sheets(filename)
tibble_list <- lapply(sheets, function(sh) readxl::read_excel(filename, sheet = sh)
df_list <- lapply(x, as.data.frame)
names(df_list) <- sheets
return(df_list)
}
# execute function for all excel files in "files"
all_data <- lapply(files, read_excel_allsheets)
Четное имя вас all_data список по базовому имени каждого файла:
# name outer list
xl_base_names <- lapply(files, basename)
all_data <- setNames(all_data, xl_base_names)
В качестве альтернативы, сократите свою функцию и используйте sapply(..., ..., simplify = FALSE
), который по умолчанию перечисляет имена по предоставленному вектору символов:
read_excel_allsheets <- function(filename, tibble = FALSE) {
sheets <- readxl::excel_sheets(filename)
sapply(sheets, function(f) as.data.frame(readxl::read_excel(filename, sheet = f)),
simplify = FALSE)
}