首先,我必须推断您的输入文件是由制表符分隔的,即使您没有指定它,因为 read.delim() 默认为 sep='\t' 。
read.delim()
sep='\t'
其次,我强烈怀疑你在数据末尾获得额外的NA列的原因是你在输入文件的每一行末尾都有一个尾随制表符。这导致了 read.delim() 考虑到尾随制表符之后有一列,它会解析为NA,因为那里什么也没有。
下面我演示一下。我创建了两个文件, file1.txt 和 file2.txt 。前者包含您的确切输入文件,因为您将其粘贴到您的问题中,假设(1)它使用制表符分隔符和(2)它在每一行上只有一个尾随制表符。后者是相同的,但没有尾随制表符。
file1.txt
file2.txt
澄清空白,在我的 cat 电话,我通过 -vet ,显示标签为 ^I 和EOLs一样 $ 。通常这不足以完全消除数据歧义,但由于我们知道您的输入文件没有抑扬或美元,因此在这种情况下它将是明确的。
cat
-vet
^I
$
system('cat -vet file1.txt;'); ## 1^ICG10619-RB^Itup^I18864094^I18864523^Irev^IGFP_RNAi3_R1^I0.870707220482784^I$ ## 1^ICG11050-RC^ICG11050^I6613278^I6612484^Irev^IGFP_RNAi3_R1^I0.999267733859066^I$ d <- read.delim('file1.txt', header=F ); d; ## V1 V2 V3 V4 V5 V6 V7 V8 V9 ## 1 1 CG10619-RB tup 18864094 18864523 rev GFP_RNAi3_R1 0.8707072 NA ## 2 1 CG11050-RC CG11050 6613278 6612484 rev GFP_RNAi3_R1 0.9992677 NA system('cat -vet file2.txt;'); ## 1^ICG10619-RB^Itup^I18864094^I18864523^Irev^IGFP_RNAi3_R1^I0.870707220482784$ ## 1^ICG11050-RC^ICG11050^I6613278^I6612484^Irev^IGFP_RNAi3_R1^I0.999267733859066$ d <- read.delim('file2.txt', header=F ); d; ## V1 V2 V3 V4 V5 V6 V7 V8 ## 1 1 CG10619-RB tup 18864094 18864523 rev GFP_RNAi3_R1 0.8707072 ## 2 1 CG11050-RC CG11050 6613278 6612484 rev GFP_RNAi3_R1 0.9992677
因此,一个好的解决方案是在将输入文件读入R之前从输入文件中删除尾随空格。(注意:我调查使用了 strip.white , colClasses ,和 col.names 的论点 read.table() (从中调用 read.delim() ,转发 ... 通过自动剥离空格或忽略额外的列来解决问题,但我没有尝试过。)
strip.white
colClasses
col.names
read.table()
...
此外,对于一般兴趣和知识,如果您有多个尾随选项卡,则每个选项卡都将被使用 read.delim() 作为分隔符,因此您将在每个此类选项卡的返回data.frame中收到相应的列:
system('cat -vet file3.txt;'); ## 1^ICG10619-RB^Itup^I18864094^I18864523^Irev^IGFP_RNAi3_R1^I0.870707220482784^I^I$ ## 1^ICG11050-RC^ICG11050^I6613278^I6612484^Irev^IGFP_RNAi3_R1^I0.999267733859066^I^I$ d <- read.delim('file3.txt', header=F ); d; ## V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 ## 1 1 CG10619-RB tup 18864094 18864523 rev GFP_RNAi3_R1 0.8707072 NA NA ## 2 1 CG11050-RC CG11050 6613278 6612484 rev GFP_RNAi3_R1 0.9992677 NA NA
为了在这里真正完成,我刚刚测试过 read.delim() 看看如果输入行包含不一致的分隔符数,它会怎么做。它似乎尊重“最宽”的输入行,这意味着返回的data.frame将包含尽可能多的列以覆盖输入文件中最分隔的行。所有短行将在其最右边的单元格中具有NA,该行未被覆盖。