2014-07-14 32 views
2

我試圖將我的矩陣切換到特定的行。現在的問題是通過下面的輸出最好的解釋:R哪個語句沒有正確地選擇字符串

Browse[2]> structure[which(structure$atom == "CA"),] 

    recordName serial atom 
    1:  ATOM  2 CA 
    2:  ATOM  10 CA 
    3:  ATOM  18 CA 
    4:  ATOM  24 CA 
    5:  ATOM  31 CA 
---       
572:  ATOM 4353 CA 
573:  ATOM 4358 CA 
574:  ATOM 4368 CA 
575:  ATOM 4377 CA 
576:  ATOM 4389 CA 

Browse[2]> structure[which(structure$atom == atom),] 

     recordName serial atom 
    1:  ATOM  1 N 
    2:  ATOM  2 CA 
    3:  ATOM  3 C 
    4:  ATOM  4 O 
    5:  ATOM  5 CB 
    ---       
4392:  ATOM 4394 ND1 
4393:  ATOM 4395 CD2 
4394:  ATOM 4396 CE1 
4395:  ATOM 4397 NE2 
4396:  ATOM 4398 OXT 

Browse[2]> atom 
[1] "CA" 

我的問題是,爲什麼當我在原子而不是鍵入CA,我得到一個不同的選擇,以行。如你所見,變量本身等於「CA」。

謝謝你的幫助!

+1

其他變量的樁真的AREN」這個例子是必要的 - 我已經刪除了它們。順便說一句,你的數據是'data.table'還是'data.frame'? – thelatemail

+1

需要注意的是,您不使用data.frame,而是使用data.table。 data.table評估它是data.table本身上下文中的索引。這意味着你可以執行結構[atom ==「CA」],這也意味着如果你有一個名爲'atom'的變量,那麼它與'structure [atom == atom]'相同,因爲它返回所有的行,因爲它首先在表格中找到「原子」符號並使用該值。 – MrFlick

+1

我認爲這是一個'data.table','=='之後的'atom'在表中被評估。 –

回答

3

data.table首先評估表格環境中的名稱,即列。

實施例:

> x <- data.table(a=1:5, b=11:15) 
> x[a==1] 
    a b 
1: 1 11 
> a <- 1 
> x[x$a==a] 
    a b 
1: 1 11 
2: 2 12 
3: 3 13 
4: 4 14 
5: 5 15 

作爲MrFlick表示,最後語句相當於x[a==a]a的列均爲x的列。

請注意,which對於此操作不是必需的,對於data.table也不是必需的,對於data.table,尾隨,不需要選擇行。

1

@matthewlundberg給你正確的解釋,作爲變通方法,使用get()

structure[which(structure$atom == get("atom", envir=globalenv())),] 

在一個側面說明,有您的發言有很多多餘的語法。也就是說,不需要which,並沒有必要引用i=參數中的數據表本身,而無需結束逗號

即使用

structure[atom == get("atom", envir=globalenv())) ] 
相關問題