R语言读取Excel多Sheet合并为单个Dataframe的函数优化问询
R多Sheet合并函数优化方案
相比for循环,更推荐使用tidyverse生态下的purrr::map_dfr()实现,和你现有代码的依赖完全兼容,代码更简洁、可扩展性更强。
改造后完整代码
library(tidyverse) library(readxl) # 原有读取单个Sheet的函数无需修改 read <- function(Path, Sheet){ df <- read_excel(path = Path, sheet = Sheet, skip = 24, na = '-')[-2, ] %>% mutate(name = Sheet) %>% rename_all(~str_replace_all(., "\\s+", "")) return(df) } # 改造后的多Sheet合并函数 sheets <- function(number = NULL, custom_sheets = NULL, file_path = "Data/file1"){ # 处理Sheet名称来源逻辑 if(!is.null(custom_sheets)){ Sheets <- custom_sheets } else if(!is.null(number)){ if(number == 1){ Sheets <- c("A", "B") } else if(number == 2){ Sheets <- c("C","D") } else{ stop("sheet number can only be 1 or 2, or use custom_sheets parameter to pass custom sheet names") } } else{ stop("you must provide either number parameter or custom_sheets parameter") } # 核心逻辑:遍历所有Sheet读取后自动按行合并 merged_df <- map_dfr(Sheets, ~read(Path = file_path, Sheet = .x)) return(merged_df) }
方案优势
- 支持任意数量的Sheet合并,无需修改内部逻辑,不管是2个还是10个Sheet都能自动处理
- 兼容原有使用习惯:原有的
sheets(1)、sheets(2)调用方式完全生效,无需调整历史代码 - 新增自定义场景支持:如果需要合并其他Sheet,直接传入
custom_sheets参数即可,例如sheets(custom_sheets = c("E","F","G")) - 新增文件路径参数,解除原硬编码限制,读取其他Excel文件时直接传
file_path参数即可 - 列兼容性更好:如果不同Sheet的列名有差异,
map_dfr会自动将缺失列填充为NA,比手动rbind容错性更高 - 无需写循环逻辑、无需创建多个中间变量,代码可读性和维护性更高
内容的提问来源于stack exchange,提问作者z star
相关产品推荐
相关产品推荐

