如何在R中读取文件夹所有Excel文件并合并单文件内工作表生成独立数据集?
解决方案:读取文件夹中Excel文件并合并每个文件内的所有工作表
你的原函数逻辑存在问题:mget(ls(...))是从全局环境中匹配变量名,而非读取磁盘上的Excel文件;且bind_cols是直接列绑定,不是按共同列合并。以下是符合需求的实现代码:
1. 加载所需包
library(openxlsx) library(dplyr) library(purrr) # 用于批量合并数据框
2. 生成示例Excel文件(用于测试)
# 生成第一个示例Excel:含2个带共同id列的工作表 data(mtcars) data(ChickWeight) ChickWeight2 <- ChickWeight %>% head(32) %>% mutate(id = 1:32) mtcars2 <- mtcars %>% mutate(id = 1:32) write.xlsx(list(sheet1 = ChickWeight2, sheet2 = mtcars2), file = "示例文件1.xlsx") # 生成第二个示例Excel:含3个带共同id列的工作表 iris1 <- iris %>% head(32) %>% mutate(id = 1:32) iris2 <- iris %>% select(-Species) %>% head(32) %>% mutate(id = 1:32, new_col = rnorm(32)) iris3 <- iris %>% select(Sepal.Length) %>% mutate(id = 1:32) write.xlsx(list(sheetA = iris1, sheetB = iris2, sheetC = iris3), file = "示例文件2.xlsx")
3. 核心实现函数
merge_excel_sheets <- function(folder_path = getwd()) { # 获取文件夹下所有Excel文件的完整路径 excel_files <- list.files(path = folder_path, pattern = "\\.xlsx$", full.names = TRUE) # 遍历每个Excel文件 for (file in excel_files) { # 获取当前文件的所有工作表名称 sheet_names <- getSheetNames(file) # 读取所有工作表,存入列表 sheet_list <- map(sheet_names, ~ read.xlsx(file, sheet = .x)) # 自动识别共同列,依次合并所有工作表(类似left_join逻辑) merged_df <- sheet_list %>% reduce(function(x, y) left_join(x, y, by = intersect(names(x), names(y)))) # 生成数据集名称:去掉文件后缀的文件名 df_name <- tools::file_path_sans_ext(basename(file)) # 将合并后的数据集存入全局环境 assign(df_name, merged_df, envir = .GlobalEnv) cat("已完成处理:", basename(file), "→ 合并后数据集:", df_name, "\n") } }
4. 运行函数并查看结果
# 运行函数(默认处理当前工作目录下的Excel文件) merge_excel_sheets() # 查看合并后的数据集 head(示例文件1) head(示例文件2)
关键逻辑说明
list.files筛选出文件夹内所有.xlsx文件,full.names=TRUE确保获取完整文件路径getSheetNames+map批量读取单个Excel内的所有工作表,生成数据框列表reduce+left_join+intersect:自动识别相邻数据框的共同列作为合并键,依次完成多表合并,无需手动指定列名tools::file_path_sans_ext提取不带后缀的文件名,作为合并后数据集的名称存入全局环境
内容的提问来源于stack exchange,提问作者user30397791
相关产品推荐
相关产品推荐

