我很高兴找到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),ia]`
在SO中有几个关于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")]
Run Code Online (Sandbox Code Playgroud)
如果我想选择A ="a"或"c"的行,我就像这样编码
DT2[A=="a"|A=="c"]
Run Code Online (Sandbox Code Playgroud)
很像data.frame方式.(小问题:如何使用更多data.table方式选择?)
所以据我所知,J()仅用于上述情况.从2个不同的列中选择两个单个值.
希望我的理解是错误的.关于J()的文件很少.我读了如何在data.table中实现J()函数?.J(.) is detected and simply replaced with list(.)
似乎每个案例列表(.)都可以替换J(.)
并回到这个问题,这个新功能的目的是什么? x[J(2), a]
如果你能给出一些详细的解释,真的很感激!
.()
并且J()
因为function
包装的i
参数data.table
被简单地替换为list()
因为[.data.table
对语言i
和j
参数的一些编程来优化内部完成的事情.它可以被认为是别名list
包含它们的原因是为了节省时间和精力(3次击键!)
如果我想选择键值'a'
或'c'
从键的第一列我可以做
DT[.(c('a','c'))]
# or
DT[J(c('a','c'))]
# or
DT[list(c('a','c'))]
Run Code Online (Sandbox Code Playgroud)
如果我想A='a' or 'c'
,B = 'd'
然后我会使用
DT[.(c('a','c'),'d')]
Run Code Online (Sandbox Code Playgroud)
如果我想,A = 'a' or 'c' and B = 'd' or 'e'
那么我会使用CJ
(或expand.grid
)创建所有组合
DT[CJ(c('a','c'),c('d','e'))]
Run Code Online (Sandbox Code Playgroud)
帮助J
,SJ
并CJ
写得很好!