2014-07-14 30 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())) ] 
相关问题