在R中的read.delim中获取附加NA列

在R中的read.delim中获取附加NA列,r,tabs,na,read.table,R,Tabs,Na,Read.table,我正在读取表单的R中的文本文件(从终端) 但是当我在R中使用read.delim阅读这篇文章时,它在末尾添加了一列NA。我可以删除该列,但我想知道为什么它会创建额外的列,以及在实际读取文件时如何避免该列 > d=read.delim("output_perl_hmi.txt", header=F) > colnames(d) <-c("COUNT", "flybasename", "GENENAME", "START", "END", "TYPE","SAMPLE", "pos

我正在读取表单的
R
中的文本文件(从终端)

但是当我在R中使用read.delim阅读这篇文章时,它在末尾添加了一列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
>d=read.delim(“output\u perl\u hmi.txt”,header=F)
>colnames(d)头(d)
计数flybasename GENENAME开始结束类型样本后验概率NA
1 CG10619-RB tup 18864094 18864523版次GFP_RNAi3_R1 0.8707072 NA
2 1 CG11050-RC CG11050 6613278 6612484版次GFP_RNAi3_R1 0.9992677 NA

首先,我必须推断您的输入文件是由制表符分隔的,即使您没有指定,因为默认值为
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
为了在这里真正完整,我刚刚测试了
read.delim()
,看看如果输入行包含不一致的分隔符,它会做什么。它似乎尊重“最宽”的输入行,这意味着返回的data.frame将包含尽可能多的列,以覆盖输入文件中最分隔的行。所有短线的最右侧单元格中都会有NA,而该行中没有包含NA。

请尝试str(d)查看添加colname前后的数据结构
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
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