R语言使用rbind合并数据时如何忽略缺失的Excel工作表避免报错
报错修复方案
错误原因
代码硬编码要求读取Mal类Excel文件中名为j的工作表,但实际该文件内不存在该工作表,触发读取异常。
修复方案
方案1:快速修复(确认Mal文件无需读取j表时使用)
直接删除Mal分支下的read_partnerALT(x, "j")行即可,修改后对应代码段为:
}else if(str_detect(x,"Mal")){ print("Reading Mal...") master <- rbind(master, read_partnerALT(x, "h"), read_partnerALT(x, "i"), read_partnerALT(x, "k") )
方案2:鲁棒性优化(兼容缺表场景,避免后续同类报错)
新增安全读取包装函数,检测到工作表不存在时主动跳过、输出警告,不会中断整体运行:
- 先定义安全读取函数:
safe_read_partnerALT <- function(file, sheet) { # 读取文件所有工作表名校验 all_sheets <- readxl::excel_sheets(file) if (!sheet %in% all_sheets) { warning(sprintf("文件%s 未找到工作表%s,已跳过读取", file, sheet)) # 返回空数据框,不影响后续合并 return(data.frame()) } return(read_partnerALT(file, sheet)) }
- 将原代码中所有
read_partnerALT替换为safe_read_partnerALT即可。
额外优化建议
你当前的代码在循环中反复对master做rbind操作,数据量较大时效率极低,可修改为列表存储再一次性合并:
import_partnersubmissions_ALT <- function(){ filelist <- list.files(path = "./Partner Submissions/", pattern = "*.xlsx") print(filelist) # 初始化列表存储所有读取结果 df_list <- list() for(x in filelist){ if(str_detect(x,"Bru")){ print("Reading Bru...") df_list <- c(df_list, list( safe_read_partnerALT(x, "a"), safe_read_partnerALT(x, "b"), safe_read_partnerALT(x, "c"), safe_read_partnerALT(x, "d"), safe_read_partnerALT(x, "e"), safe_read_partnerALT(x, "f"), safe_read_partnerALT(x, "g") )) }else if(str_detect(x,"Mal")){ print("Reading Mal...") df_list <- c(df_list, list( safe_read_partnerALT(x, "h"), safe_read_partnerALT(x, "i"), safe_read_partnerALT(x, "j"), safe_read_partnerALT(x, "k") )) }else if(str_detect(x,"Sgp")){ print("Reading Sgp...") df_list <- c(df_list, list( safe_read_partnerALT(x, "l"), safe_read_partnerALT(x, "m"), safe_read_partnerALT(x, "n"), safe_read_partnerALT(x, "o") )) }else if(str_detect(x,"Mld")){ print("Reading Mld...") df_list <- c(df_list, list( safe_read_partnerALT(x, "p"), safe_read_partnerALT(x, "q"), safe_read_partnerALT(x, "r"), safe_read_partnerALT(x, "s") )) } } # 一次性合并所有数据框 master <- dplyr::bind_rows(df_list) return(master) }
内容的提问来源于stack exchange,提问作者user16597745
相关产品推荐
相关产品推荐

