在R中的read.delim中获取其他NA列

时间:2015-04-09 23:54:42

标签: r tabs na read.table

我正在阅读表单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

1 个答案:

答案 0 :(得分:1)

首先,我必须推断您的输入文件是由制表符分隔的,即使您没有指定此选项,因为read.delim()默认为sep='\t'

其次,我强烈怀疑您在数据末尾获得额外的NA列的原因是您在输入文件的每一行末尾都有一个尾随选项卡。这导致read.delim()考虑在尾随选项卡后面有一列,它将其解析为NA,因为那里没有任何内容。

下面我演示一下。我创建了两个文件file1.txtfile2.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.whitecolClassescol.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,该行未被覆盖。