行名称的结果非常奇怪。这是一个错误吗?

时间:2014-07-02 09:16:42

标签: r

我有一个包含此内容的文件(标签分隔):

bin_id  chr bin EURO.hz
chrF1_17700000  chrF1   17700000    102
chrF1_17800000  chrF1   17800000    199
chrF1_17900000  chrF1   17900000    398
chrF1_18000000  chrF1   18000000    410
chrF1_18100000  chrF1   18100000    342
chrF1_18200000  chrF1   18200000    447

我加载它:

jo <- read.table("tmp.tsv",header=T,row.names=1,sep="\t")

一切都很顺利。

然后,当我这样做时:

jo["chrF1_1800",]

我得到了行名&#34; chrF1_18000000&#34;:

                 chr      bin EURO.hz
chrF1_18000000 chrF1 18000000     410

请注意不同数量的零。重新解决问题:虽然行名称&#34; chrF1_180000&#34;或&#34; chrF1_180&#34;不存在,R返回&#34; chrF1_18000000&#34;。

我在不同的R版本(3.0.1(2013-05-16)和R版本2.15.2(2012-10-26))的两台不同的机器(linux,mac)中试过这个。

这种行为对我来说完全出乎意料(并且我的脚本中有许多错误)。这是一个错误???

谢谢! 费德里科

2 个答案:

答案 0 :(得分:1)

按行名称子集data.frame使用部分匹配,如documentation中所述:

  

[和[[提取方法部分匹配行名称]。默认情况下   既不是部分匹配列名,也不是[[如果精确= FALSE   (如果精确= NA,则发出警告)。如果你想要完全匹配   行名称使用匹配,如示例中所示。

如果您想要完全匹配,可以使用match功能,例如:

# partial matching does not work
jo[match("chrF1_18000",row.names(jo)),] 
#       chr bin EURO.hz
#   NA <NA>  NA      NA

# exact matching works
jo[match("chrF1_18000000",row.names(jo)),]
#                   chr      bin EURO.hz
#  chrF1_18000000 chrF1 18000000     410

答案 1 :(得分:0)

或使用subset

 subset(jo, rownames(jo)=="chrF1_1800")
 #[1] chr     bin     EURO.hz
 #<0 rows> (or 0-length row.names)
 subset(jo, rownames(jo)=="chrF1_18000000")
   #             chr      bin EURO.hz
  #chrF1_18000000 chrF1 18000000     410

grep

 jo[grep("\\<chrF1_1800\\>",row.names(jo)),]
 #[1] chr     bin     EURO.hz
 #<0 rows> (or 0-length row.names)