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

R语言循环读取TSV文件时首行空值致列丢失的解决方法

解决TSV文件首行空列导致read_tsv丢弃列的问题

针对批量TSV文件读取时,因最后一列首行空值被read_tsv丢弃的问题,提供以下几种可行方案:

方案1:使用vroom包读取(推荐)

vroom是readr生态下的高效文件读取工具,会扫描整个文件结构,不会因首行某列空值误判列数,同时批量读取性能更优:

# 若未安装vroom先执行安装
# install.packages("vroom")
library(vroom)

public_folder <- "C:/Users/eulus/Desktop/test/interproscan/public_results/"       
# 使用full.names直接获取完整文件路径,避免拼接出错
public_file_list <- list.files(path=public_folder, pattern="*.tsv", full.names = TRUE)  

for (file in public_file_list) {
  # 提取文件名作为存储的对象名
  obj_name <- basename(file)
  # 读取文件,自动识别所有列(即使首行有空值)
  assign(obj_name, vroom(file, col_names = FALSE, delimiter = "\t", skip_empty_rows = FALSE))
}

方案2:调整read_tsv的guess_max参数

read_tsv默认仅通过前1000行推断列类型,若首行空列在后续行才有值,会导致列被丢弃。将guess_max设为文件总行数,让工具读取所有行来判断列结构:

library(readr)

public_folder <- "C:/Users/eulus/Desktop/test/interproscan/public_results/"       
public_file_list <- list.files(path=public_folder, pattern="*.tsv", full.names = TRUE)  

for (file in public_file_list) {
  obj_name <- basename(file)
  # 获取文件总行数
  total_rows <- length(readLines(file))
  # 强制读取所有行来推断列类型
  dat <- read_tsv(file, col_names = FALSE, skip_empty_rows = FALSE, guess_max = total_rows)
  assign(obj_name, dat)
}

方案3:强制指定列类型(适合列数固定的场景)

如果所有文件的列数和类型固定(比如你提到的14列),直接定义列规格,强制保留所有列:

library(readr)

# 根据你提供的列规格,定义完整的列类型
col_spec <- cols(
  X1 = col_character(),
  X2 = col_character(),
  X3 = col_double(),
  X4 = col_character(),
  X5 = col_character(),
  X6 = col_character(),
  X7 = col_double(),
  X8 = col_double(),
  X9 = col_character(),
  X10 = col_logical(),
  X11 = col_character(),
  X12 = col_character(),
  X13 = col_character(),
  X14 = col_character() # 强制保留最后一列,忽略首行空值
)

public_folder <- "C:/Users/eulus/Desktop/test/interproscan/public_results/"       
public_file_list <- list.files(path=public_folder, pattern="*.tsv", full.names = TRUE)  

for (file in public_file_list) {
  obj_name <- basename(file)
  dat <- read_tsv(file, col_names = FALSE, skip_empty_rows = FALSE, col_types = col_spec)
  assign(obj_name, dat)
}

补充说明

  • 上述方案均可避免手动修改文件的繁琐操作,适配数百个文件的批量处理场景。
  • 若仍有警告,可调用problems(dat)查看具体解析问题,但以上方法已覆盖你遇到的核心丢列问题。

内容的提问来源于stack exchange,提问作者EDUlusman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:01:11