R中为dataframe添加sheet名作变量时第二段代码报错找不到sheet
问题根源
- 触发报错的核心原因:你之前定义的全局变量
sheets,仅对应Ambala.xlsx的工作表名称集合。不同区县的Excel文件内部的sheet命名规则和数量都有差异(比如Bhiwani.xlsx中并不存在Ambala文件里叫Block I的工作表),直接复用旧的sheets列表去读取Bhiwani的文件,自然会报找不到sheet的错误。 - 代码逻辑的次要问题:你写的第二段代码执行顺序颠倒,在
H_Bhiwani数据框还未生成的情况下,就先给它赋值District列,后续即便解决了sheet读取的问题,也会触发对象不存在的报错。
修复方法
每个Excel文件读取前,先调用readxl::excel_sheets()获取当前文件专属的sheet名称列表,同时调整代码执行顺序,先完成数据合并,再补充地区列。
单文件修正示例(以Bhiwani为例)
# 第一步:单独获取Bhiwani.xlsx自己的所有sheet名,不要复用Ambala的sheets变量 bhiwani_sheets <- readxl::excel_sheets("/Users/emmawilliamson/Desktop/Haryana2010/Bhiwani.xlsx") # 第二步:先合并生成包含所有Block数据的基础dataframe H_Bhiwani <- do.call(rbind, lapply(bhiwani_sheets, function(X) transform(readxl::read_excel("/Users/emmawilliamson/Desktop/Haryana2010/Bhiwani.xlsx", sheet = X), Block = X))) # 第三步:补充District列 H_Bhiwani['District'] = 'Bhiwani' View(H_Bhiwani)
批量处理优化方案
如果后续需要处理多个区县的Excel,不需要每个文件重复写代码,直接按下面的逻辑批量遍历即可,能完全避免跨文件复用sheet列表的问题:
# 预先配置需要处理的文件路径和对应区县名 file_config <- data.frame( xlsx_path = c( "/Users/emmawilliamson/Desktop/Haryana2010/Ambala.xlsx", "/Users/emmawilliamson/Desktop/Haryana2010/Bhiwani.xlsx" # 新增其他区县时直接在这里补充路径和区县名即可 ), district = c("Ambala", "Bhiwani") ) # 批量生成全量合并数据 full_dataset <- do.call(rbind, lapply(1:nrow(file_config), function(idx){ current_file <- file_config$xlsx_path[idx] current_dist_name <- file_config$district[idx] # 每次遍历都获取当前文件自己的sheet列表 current_sheet_list <- readxl::excel_sheets(current_file) # 合并当前文件所有sheet的数据,同时自动填充Block名 df <- do.call(rbind, lapply(current_sheet_list, function(sheet_name){ transform(readxl::read_excel(current_file, sheet = sheet_name), Block = sheet_name) })) # 填充当前区县名 df$District <- current_dist_name return(df) })) View(full_dataset)
内容的提问来源于stack exchange,提问作者Emma Williamson
相关产品推荐
相关产品推荐

