如何在R中批量加载多个Excel文件并解决合并时列类型不匹配问题
问题说明
你需要合并存放在data文件夹下的50个列名一致的Excel文件为单个dataframe,当前使用代码:
dir("data", full.names = T) %>% map_dfr(read_excel)
运行时报错:
Error: Can't combine
..1$Biaotiand..26$Biaoti
已知所有文件的Biaoti列仅包含0或1,需要解决不同文件同列类型不一致导致的合并失败问题。
报错原因
read_excel默认会按单个文件的前几行内容推断列类型,不同文件的同列可能被识别为不同类型:比如前25个文件的Biaoti列被推断为数值型,第26个文件的Biaoti列可能因为存在空值、特殊单元格格式被识别为字符型/逻辑型,不同类型的列无法直接按行合并。
解决方案
方案1:读取时强制指定列类型(最稳妥)
先提前指定Biaoti列的类型为数值,其他列可保留自动推断,避免类型识别偏差:
library(readxl) library(purrr) # 读取第一个文件的表头,生成列类型配置 sample_path <- dir("data", full.names = TRUE)[1] all_cols <- names(read_excel(sample_path, n_max = 0)) col_types <- rep("guess", length(all_cols)) names(col_types) <- all_cols # 强制Biaoti列为数值型 col_types["Biaoti"] <- "numeric" # 批量读取合并 dir("data", full.names = TRUE) %>% map_dfr(~ read_excel(.x, col_types = col_types))
方案2:读取后统一转换列类型再合并
适合不确定其他列类型配置的场景,先读取每个文件单独转换Biaoti列类型后再合并:
library(readxl) library(purrr) library(dplyr) dir("data", full.names = TRUE) %>% map(function(path) { df <- read_excel(path) # 强制转换Biaoti列为数值,非0/1的异常值会转为NA df$Biaoti <- as.numeric(df$Biaoti) return(df) }) %>% bind_rows()
补充说明
如果转换后出现异常NA值,可单独打开第26个Excel文件检查Biaoti列是否存在空格、特殊字符、非常规空值,清理后重新运行代码即可。
内容的提问来源于stack exchange,提问作者Muhammad Kamil
相关产品推荐
相关产品推荐

