You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并多个文本文件时遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:35:20