R哪个语句没有恰当地选择字符串

时间:2014-07-14 00:52:16

标签: r data.table

我正在尝试将矩阵切割为特定行。最好通过以下输出解释这个问题:

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"

我的问题是,为什么当我输入 atom 而不是 CA 时,我会对行进行不同的选择。如您所见,变量本身等于“CA”。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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,选择行不需要尾随,

答案 1 :(得分:1)

@matthewlundberg为您提供了正确的解释,至于解决方法,请使用get()

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

在旁注中,语句中有许多多余的语法。即,不需要which,并且不需要在i=参数内引用数据表本身,也不需要结束逗号

即使用

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