我正在阅读表单R
中的文本文件(来自终端)
hmi$ head -2 output_perl_hmi.txt
1 CG10619-RB tup 18864094 18864523 rev GFP_RNAi3_R1 0.870707220482784
1 CG11050-RC CG11050 6613278 6612484 rev GFP_RNAi3_R1 0.999267733859066
但是当我使用read.delim在R中读取它时,它会在末尾添加一个额外的NA列。我可以删除该列,但我想知道它为什么要创建这个额外的列,我怎么能在实际读取文件时避免这一点。
> d=read.delim("output_perl_hmi.txt", header=F)
> colnames(d) <-c("COUNT", "flybasename", "GENENAME", "START", "END", "TYPE","SAMPLE", "posterior_probability")
> head(d)
COUNT flybasename GENENAME START END TYPE SAMPLE posterior_probability NA
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
答案 0 :(得分:1)
首先,我必须推断您的输入文件是由制表符分隔的,即使您没有指定此选项,因为read.delim()
默认为sep='\t'
。
其次,我强烈怀疑您在数据末尾获得额外的NA列的原因是您在输入文件的每一行末尾都有一个尾随选项卡。这导致read.delim()
考虑在尾随选项卡后面有一列,它将其解析为NA,因为那里没有任何内容。
下面我演示一下。我创建了两个文件file1.txt
和file2.txt
。前者包含您的确切输入文件,因为您将其粘贴到您的问题中,假设(1)它使用制表符分隔符和(2)它在每一行上只有一个尾随制表符。后者是相同的,但没有尾随标签。
为了澄清空白,在我的cat
来电中,我传递-vet
,其中标签为^I
,EOL为$
。通常这不足以完全消除数据的歧义,但由于我们知道您的输入文件没有抑扬或美元,因此在这种情况下它将是明确的。
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()
调用,将...
转发给它)通过自动剥离空格或忽略额外的列来解决问题,但我没有尝试过任何工作。)
此外,出于一般兴趣和知识,如果您有多个尾随选项卡,每个选项卡都将由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,该行未被覆盖。