我很高兴找到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]
如果你能给出一些详细的解释,我们非常感激!
答案 0 :(得分:6)
.()
和J()
作为function
包裹i
data.table
参数的list()
被[.data.table
替换为i
因为j
对list
和'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}}的帮助写得非常好!