2014-07-02 14 views
2

我有這個內容的文件(製表符分隔):行名非常奇怪。這是一個錯誤?

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",] 

我得到行名稱 「chrF1_18000000」:

    chr  bin EURO.hz 
chrF1_18000000 chrF1 18000000  410 

注意不同數量的零。要重新解釋問題:雖然行名稱「chrF1_180000」或「chrF1_180」不存在,但R返回「chrF1_18000000」。

我在不同的R版本(3.0.1(2013-05-16)和R版本2.15.2(2012-10-26))試過這兩種不同的機器(Linux,Mac)。

這種行爲對我來說完全是意料之外的(並且是我的腳本中的許多錯誤的責任)。這是一個錯誤?

謝謝! 費德里科

+0

似乎有一些[R專家們的建議從來沒有使用行名。我正在接近他們的觀點。 –

回答

1

一個子集通過data.frame行名字使用局部匹配,如在documentation指出:

兩者[和[[提取方法部分地匹配行的名稱。默認情況下, 既不與列名部分匹配,但[[如果exact = FALSE (如果exact = NA,則會發出警告)。如果你想精確匹配 行名稱,請使用match,如示例中所示。

如果你想精確匹配,你可以使用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 
+0

[answer]謝謝!! – user3796965

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)