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

如何判定TXT文件分隔符类型并正确导入数据?

如何正确导入TXT格式的基因数据

我有一份TXT格式的基因数据,尝试用R的tidyverse包导入,但遇到了格式问题:

尝试1:用空格作为分隔符

运行代码:

library(tidyverse)
data <- read_delim("<PATH>\\pgc.cross.SCZ17.2013-05.txt", delim = " ")
head(data)

返回结果:

# A tibble: 6 × 12
  snpid    hg18chr bp    a1    a2    or    se    pval  info  ngt   CEUaf
  <chr>    <lgl>   <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl>
1 "rs3131… NA      NA    NA    NA    NA    NA    NA    NA    NA    NA   
2 "rs3131… NA      NA    NA    NA    NA    NA    NA    NA    NA    NA   
3 "rs3131… NA      NA    NA    NA    NA    NA    NA    NA    NA    NA   
4 "rs1048… NA      NA    NA    NA    NA    NA    NA    NA    NA    NA   
5 "rs1256… NA      NA    NA    NA    NA    NA    NA    NA    NA    NA   
6 "rs4040… NA      NA    NA    NA    NA    NA    NA    NA    NA    NA   
# … with 1 more variable: ...12 <lgl>
# ℹ Use `colnames()` to see all variable names

所有数值列都变为NA,导入失败。

尝试2:用制表符作为分隔符

运行代码:

data <- read_delim("<PATH>\\pgc.cross.SCZ17.2013-05.txt", delim = "\t")
head(data)

返回结果:

# A tibble: 6 × 1
  `snpid hg18chr bp a1 a2 or se pval info ngt CEUaf `                   
  <chr>                                                                 
1 "rs3131972\t1\t742584\tA\tG\t1\t0.0966\t0.9991\t0.702\t0\t0.16055"    
2 "rs3131969\t1\t744045\tA\tG\t1\t0.0925\t0.9974\t0.938\t0\t0.133028"   
3 "rs3131967\t1\t744197\tT\tC\t1.001\t0.0991\t0.9928\t0.866\t0\t."      
4 "rs1048488\t1\t750775\tT\tC\t0.9999\t0.0966\t0.9991\t0.702\t0\t0.8364…
5 "rs12562034\t1\t758311\tA\tG\t1.025\t0.0843\t0.7716\t0.988\t0\t0.0925…
6 "rs4040617\t1\t769185\tA\tG\t0.9993\t0.092\t0.994\t0.979\t0\t0.87156"

所有数据被合并到一列,导入不符合预期。

但用Sublime Text打开该文件时,数据为正常分列显示(见截图:Sublime Text中正常显示的数据)。

解决方案

问题出在文件的引号转义和实际分隔符上:每一行数据被双引号包裹,内部用制表符分隔,read_delim默认会将引号内内容视为整体,导致识别错误。可通过以下两种方法解决:

方法1:调整read_delim参数

明确指定引号规则、制表符分隔符,并开启空格修剪:

library(tidyverse)
data <- read_delim("<PATH>\\pgc.cross.SCZ17.2013-05.txt", 
                   delim = "\t", 
                   quote = "\"", 
                   trim_ws = TRUE)
head(data)

方法2:使用read.table

read.table对带引号的制表符分隔文件兼容性更好,直接指定参数即可:

data <- read.table("<PATH>\\pgc.cross.SCZ17.2013-05.txt", 
                   sep = "\t", 
                   quote = "\"", 
                   header = TRUE, 
                   stringsAsFactors = FALSE)
head(data)

两种方法都能正确解析文件,得到与Sublime Text中一致的分列格式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:35:20