问题 R:为什么read.table会停止读取文件?


我有一个名为的文件 genes.txt,我想成为一个data.frame。它有很多行,每行有三个制表符分隔的字段:

mike$ wc -l genes.txt
   42476 genes.txt

我想把这个文件读到R中的data.frame中。我使用read.table命令,如下所示:

genes = read.table(
    genes_file, 
    sep="\t", 
    na.strings="-", 
    fill=TRUE,
    col.names=c("GeneSymbol","synonyms","description")
)

这似乎工作正常,在哪里 genes_file 指向 genes.txt。但是,我的data.frame中的行数明显少于我的文本文件中的行数:

> nrow(genes)
[1] 27896

我可以在文本文件中找到的东西:

mike$ grep "SELL" genes.txt 
SELL    CD62L|LAM1|LECAM1|LEU8|LNHR|LSEL|LYAM1|PLNHR|TQ1    selectin L

似乎不在data.frame中

> grep("SELL",genes$GeneSymbol)
integer(0)

事实证明

genes = read.delim(
    genes_file,
    header=FALSE,
    na.strings="-",
    fill=TRUE,
    col.names=c("GeneSymbol","synonyms","description"),
)

工作得很好。为什么read.delim在read.table时不起作用?

如果它有用,你可以重新创建 genes.txt 使用以下命令,您应该从命令行运行

curl -O ftp://ftp.ncbi.nlm.nih.gov/gene/DATA/gene_info.gz
gzip -cd gene_info.gz | awk -Ft '$1==9606{print $3 "\t" $5 "\t" $9}' > genes.txt

但要注意,gene_info.gz是101MBish。


6219
2018-06-10 16:25


起源

第27897行有什么特别的东西可以打破进口吗?我现在无法下载该文件,如果您还没有收到回复,我会稍后再试。 - nico
不是我能看到的!事实证明read.delim工作正常,所以这比现在稍微烦人。我已经非常认真地编辑了这个问题(对于在它上升的前4分钟内读取它的11个人道歉)重新解释为什么read.delim在read.table失败时工作的问题? - Mike Dewar
我没有查看该文件,但引用和评论是两种常见的方法。例如,read.table将'#'视为注释字符,不适用于许多文件。 - Jonathan Chang


答案:


对于read.table,其中一个默认引号字符是单引号。我猜你在描述字段中有一些不匹配的单引号,并且单引号之间的所有数据被汇总到一个条目中。

使用read.delim时,defualt引号字符是双引号,因此这不是问题。

指定你的引用字符,你应该全部设置。

> genes<-read.table("genes.txt",sep="\t",quote="\"",na.strings="-",fill=TRUE, col.names=c("GeneSymbol","synonyms","description"))
> nrow(genes)
[1] 42476

15
2018-06-10 18:07



谢谢!我希望我应该注意到我的最后一个条目是巨大的!学习曲线的乐趣...... - Mike Dewar
加入学习曲线教会。 :) - Roman Luštrik
另一个选项(我用过)是设置quote =“”并简单地删除引号。请注意,您更有可能遇到此问题 默默 如果你使用fill = TRUE。 - Andy McKenzie