关于data.table 1.9.2的新功能J()

时间:2014-03-02 15:48:07

标签: r data.table

我很高兴找到data.table有它的新版本,并得到一个关于J()

的问题
  

x [J(2),a],其中'a'是关键列,在'j',#2693和FAQ 2.8中看到'a'。此外,x [J(2)]使用'x'的键列自动命名'i'中的列。在'x'和'i'的关键列相同的情况下,可以使用'i.name'来引用i的列;例如,x [J(2),i.a]`

在S.O中有几个关于J()的问题,还有关于数据的介绍。关于J()的二进制搜索的讨论。但我对J()的理解还不是很清楚。

我所知道的是,如果我想选择A列中“b”和B列中“d”的行:

DT2 <- data.table(A= letters[1:5], B=letters[3:7], C=1:5)
setkey(DT2,A,B)
DT2[J("b","d")]

如果我想选择A =“a”或“c”的行,我就像这样编码

DT2[A=="a"|A=="c"]

很像data.frame方式。 (小问题:如何使用更多data.table方式选择?)

所以根据我的理解,J()仅用于上述情况。从2个不同的列中选择两个单个值。

希望我的理解是错误的。关于J()的文件很少。我看了How is J() function implemented in data.table?J(.) is detected and simply replaced with list(.)

似乎每个案例列表(。)都可以替换J(。)

回到问题,这个新功能的目的是什么? x[J(2), a]

如果你能给出一些详细的解释,我们非常感激!

1 个答案:

答案 0 :(得分:6)

.()J()作为function包裹i data.table参数的list()[.data.table替换为i因为jlist'a'参数的语言进行一些编程,以优化内部完成的工作。它可以被视为'c'

的别名

包含它们的原因是为了节省时间和精力(3次击键!)

如果我想从密钥的第一列中选​​择关键值DT[.(c('a','c'))] # or DT[J(c('a','c'))] # or DT[list(c('a','c'))] A='a' or 'c'

B = 'd'

如果我想要DT[.(c('a','c'),'d')] A = 'a' or 'c' and B = 'd' or 'e',那么我可以使用

CJ

如果我想要expand.grid,那么我会使用DT[CJ(c('a','c'),c('d','e'))] (或J)来创建所有组合

SJ

CJ,{{1}}和{{1}}的帮助写得非常好!