R语言批量导入含多工作表的.xlsx文件生成嵌套列表问题
问题原因
read_xlsx()函数默认参数sheet = 1,仅会读取单个Excel文件的第一个工作表,因此你原来的代码生成的是仅包含6个文件首个工作表的单层列表。
实现代码
使用嵌套遍历即可实现「外层列表对应Excel文件、内层列表对应文件内工作表」的嵌套结构,你需要用到readxl包提供的excel_sheets()函数获取单个文件的所有工作表名:
library(readxl) path_ <- "~/Desktop/my_folder/" file.list <- list.files(path = path_, pattern = "\\.xlsx$", full.names = TRUE) # 嵌套lapply:外层遍历文件,内层遍历同文件的所有工作表 df.list <- lapply(file.list, function(x) { # 获取当前文件的所有工作表名 sheets <- excel_sheets(x) # 读取当前文件的所有工作表,生成本次内层列表 lapply(sheets, function(s) read_xlsx(path = x, sheet = s)) })
结果验证
运行以下代码可以检查列表结构是否符合要求:
str(df.list, max.level = 2)
输出结果会显示第一层有6个元素(对应6个Excel文件),每个元素下包含5个子元素(对应单文件内的5个工作表),完全匹配你需要的[[文件序号]][[工作表序号]]调用格式。
可选优化(按需使用)
如果需要更直观的调用方式,可以给两层列表加上名称,直接通过文件名、工作表名调取数据:
# 外层列表命名为文件名,内层列表命名为工作表名 df.list_named <- setNames(df.list, basename(file.list)) |> lapply(function(file_data) setNames(file_data, excel_sheets(file.list[[match(file_data, df.list)]]))) # 调用示例:调取第一个xlsx文件的第一个工作表数据 df.list_named[[1]][[1]] # 或按名称调取 df.list_named[["某文件.xlsx"]][["某工作表名"]]
内容的提问来源于stack exchange,提问作者Jh00ni
相关产品推荐
相关产品推荐

