You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:57:01