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
相关产品推荐
相关产品推荐

