合并多个文本文件时遇dplyr::bind_rows类型不匹配错误求助
合并多个文本文件出现类型不匹配错误的解决方法
原代码
library(tidyverse) (files_to_read <- list.files(path="/datahome/mario/datasets/robson/CLAY_Arquivos_PDF/TXT")) read_a_file <- function(x){ read.delim(file = file.path("/datahome/mario/datasets/robson/CLAY_Arquivos_PDF/TXT",x) ,header = TRUE) %>% mutate(filename=x) } (myresults<-purrr::map_dfr(files_to_read, read_a_file))
错误信息
Error in `dplyr::bind_rows()`: ! Can't combine `..1$filename` <character> and `..4237$filename` <logical>. Backtrace: 1. purrr::map_dfr(files_to_read, read_a_file) 2. dplyr::bind_rows(res, .id = .id) 5. vctrs::vec_rbind(!!!dots, .names_to = .id)
问题原因
第4237个文件读取失败,read.delim返回了逻辑值(如FALSE)而非数据框,导致mutate(filename=x)无法生成字符型的filename列,合并时出现字符型与逻辑型的类型冲突。
解决方案
方案1:用purrr::safely捕获错误并分离结果
此方法保留成功读取的数据,同时记录读取失败的文件及错误信息:
library(tidyverse) files_to_read <- list.files(path = "/datahome/mario/datasets/robson/CLAY_Arquivos_PDF/TXT") # 包装读取函数,捕获错误 safe_read <- safely(function(x) { read.delim(file = file.path("/datahome/mario/datasets/robson/CLAY_Arquivos_PDF/TXT", x), header = TRUE) %>% mutate(filename = as.character(x)) }) # 批量读取文件 read_results <- map(files_to_read, safe_read) # 合并成功读取的数据 myresults <- map_dfr(read_results, "result") # 查看读取失败的文件 failed_files <- tibble( filename = files_to_read[map_lgl(read_results, ~ is.null(.x$result))], error_msg = map_chr(read_results[map_lgl(read_results, ~ is.null(.x$result))], "error", .default = "未知错误") ) print(failed_files)
方案2:用tryCatch处理错误,返回统一结构的数据框
此方法将读取失败的文件信息纳入结果数据框,方便统一查看:
library(tidyverse) files_to_read <- list.files(path = "/datahome/mario/datasets/robson/CLAY_Arquivos_PDF/TXT") read_a_file <- function(x){ tryCatch({ # 读取成功时返回带文件名的数据框 read.delim(file = file.path("/datahome/mario/datasets/robson/CLAY_Arquivos_PDF/TXT", x), header = TRUE) %>% mutate(filename = as.character(x), error_msg = NA_character_) }, error = function(e) { # 读取失败时返回带错误信息的空行数据框 tibble(filename = as.character(x), error_msg = e$message) }) } # 合并所有结果 myresults <- map_dfr(files_to_read, read_a_file) # 筛选出读取失败的记录 filter(myresults, !is.na(error_msg))
关键修改点
- 强制
filename为字符型(as.character(x)),确保所有数据框的该列类型一致。 - 添加错误捕获机制,避免单个文件读取失败导致整个合并流程中断。
- 保留失败文件的信息,便于排查问题(如文件损坏、格式不符合预期等)。
内容的提问来源于stack exchange,提问作者Robson Costa
相关产品推荐
相关产品推荐

