R读取多工作表xlsx文件逐表去重的代码问题排查
代码问题定位与修复方案
问题根因
仅能得到单工作表结果的原因
- 循环中每次执行
updateddata = unique(list_all_sheets[[i]])都会覆盖上一次的计算结果,循环结束后updateddata仅保留最后一张工作表的去重结果 - 最终
write.xlsx仅写入了这单个数据框,默认生成1个工作表,因此看不到其他工作表的处理结果 - 循环内的
assign操作未被后续逻辑使用,属于无效代码
输出首行首列出现...的原因
write.xlsx默认开启行名输出,会把数据框的行号写入Excel第一列,如果读入的原始表首列无列名,或tibble转data.frame时存在隐式列名,就会生成...1这类占位符,看起来就是首行首列有...符号
修复后代码
library(readxl) library(openxlsx) config_file_name <- '/RBIAPI3tables.xlsx' config_xl <- paste0(currentPath, config_file_name) config_xl_sheets_name <- excel_sheets(path = config_xl) # 批量读取所有工作表 list_all_sheets <- lapply(config_xl_sheets_name, function(x) read_excel(path = config_xl, sheet = x)) names(list_all_sheets) <- config_xl_sheets_name # 对每张工作表单独执行行去重 list_updated_sheets <- lapply(list_all_sheets, unique) # 写入结果,所有去重后的表对应存入独立工作表,关闭行名输出 write.xlsx(list_updated_sheets, file = "Unique3tables.xlsx", showNA = FALSE, rowNames = FALSE)
优化说明
- 用
lapply替代for循环完成批量去重,代码更简洁,也避免了变量覆盖的问题 - 直接传入去重后的工作表列表给
write.xlsx,函数会自动把列表的每个元素作为独立工作表写入,和原始表的工作表名称一一对应 - 新增
rowNames = FALSE参数关闭行名输出,彻底解决...占位符问题
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

