R语言读取Tab分隔文件时出现列错位问题的原因排查
列错位问题产生原因
- 目标Tab文件的部分文本字段(多为基因功能描述字段)本身包含半角双引号
"字符,read.table()默认将双引号识别为字段边界包裹符,当某行字段内出现未配对的双引号时,函数会持续向后读取内容直到匹配到下一个双引号才会判定当前字段结束,读取过程中会直接跳过中间的Tab分隔符,直接导致后续所有列的位置偏移。 - Excel、LibreOffice的分隔文件解析逻辑容错性更高,仅会将出现在字段起始位置的引号判定为包裹符,字段中间出现的引号会按普通文本处理,因此打开时不会出现格式错乱。
- 代码中设置的
fill=TRUE参数会在函数判定当前行列数少于表头列数时自动补填空值,直接掩盖了列数不匹配的原始报错,让错位问题最终保留在读取结果中。
修复方法
核心修复点是将quote参数设置为空字符串,完全关闭函数对字段包裹引号的识别,同时移除会掩盖报错的fill=TRUE参数,修正后的可运行代码如下:
library(RCurl) URL <- "http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=507522;export=tab" x <- getURL(URL, ssl.verifypeer = FALSE) finch <- read.table( file = textConnection(x), header = TRUE, sep = "\t", quote = "", stringsAsFactors = FALSE )
可选优化:如果需要读取大体积分隔文件,可以替换为
data.table包的fread()函数,该函数对特殊字符、分隔符的默认识别逻辑更适配常规生物信息类导出文件,出现列错位的概率极低,同时读取速度远高于基础包的read.table()。
内容的提问来源于stack exchange,提问作者Trinh Phan-Canh
相关产品推荐
相关产品推荐

