R导入xlsx文件时因空行报错,如何设置让R接受单元格缺失值?
解决R批量导入Excel时因列缺失值导致的行数不匹配报错
报错原因
你当前的写法是通过map_dfc循环读取单个列再按列合并,而openxlsx包的read.xlsx函数默认会自动跳过列尾部的空单元格,导致不同列读取后得到的行数不一致,map_dfc要求合并的所有列行数完全匹配,因此触发回收报错。
最优解决方案
不要逐列读取,直接一次性读取所有指定列,read.xlsx的cols参数原生支持传入列号向量,读取时会自动对齐所有列的行数,空单元格自动填充为NA,完全避免行数不匹配问题,同时执行效率更高:
# 优化后的自定义读取函数 library(openxlsx) fctn <- function(path){ read.xlsx( path, sheet = 1, startRow = 7, colNames = FALSE, cols = c(1,2,3,7,10,11,12,13) # 直接传入所有要读取的列号 ) } # 批量追加代码无需修改 all.files <- map_dfr(file.list, ~ fctn(path=.x))
备选方案(保留逐列读取逻辑)
如果你确实有逐列读取的特殊需求,可以修改read.xlsx的skipEmptyRows参数,关闭自动跳过空行的逻辑,保证每列读取后的行数一致,空值自动转为NA:
fctn <- function(path){ map_dfc( .x = c(1,2,3,7,10,11,12,13), ~ read.xlsx( path, sheet=1, startRow = 7, colNames = FALSE, cols = .x, skipEmptyRows = FALSE # 关闭跳过空行逻辑 ) ) }
补充注意事项
如果后续批量追加时出现列类型不匹配的报错,可以在read.xlsx中通过colClasses参数统一指定每列的类型,也可以在map_dfr中添加.id参数标记数据来源文件,方便后续校验数据。
内容的提问来源于stack exchange,提问作者so03tw
相关产品推荐
相关产品推荐

