对 a 进行子集化的最快方法是什么data.table
?
使用基于二分搜索的子集功能是最快的。请注意,子集需要选项nomatch = 0L
以便只返回匹配的结果。
如何仅在设置了两个键的情况下按其中一个键进行子集化?
如果您设置了两个键DT
你想要subset by the 第一把钥匙,那么你可以只提供第一个值J(.)
,无需为第二个密钥提供任何内容。那是:
# will return all columns where the first key column matches 22
DT[J(22), nomatch=0L]
相反,如果您想按第二把钥匙,那么您现在必须提供第一个键的所有唯一值。那是:
# will return all columns where 2nd key column matches 2
DT[J(unique(V1), 2), nomatch=0L]
这也显示在这个帖子中 https://stackoverflow.com/questions/15597685/subsetting-data-table-by-2nd-column-only-of-a-2-column-key-using-binary-search。虽然我更喜欢这样DT[J(, 2)]
适用于这种情况,因为这看起来相当直观。
还有一个待处理的功能请求,用于实现辅助密钥,完成后将解决此问题。
这是一个更好的例子:
DT = data.table(c(1,2,3,4,5), c(2,3,2,3,2))
DT
# V1 V2
# 1: 1 2
# 2: 2 3
# 3: 3 2
# 4: 4 3
# 5: 5 2
setkey(DT,V1,V2)
DT[J(unique(V1),2)]
# V1 V2
# 1: 1 2
# 2: 2 2
# 3: 3 2
# 4: 4 2
# 5: 5 2
DT[J(unique(V1),2), nomatch=0L]
# V1 V2
# 1: 1 2
# 2: 3 2
# 3: 5 2
DT[J(3), nomatch=0L]
# V1 V2
# 1: 3 2
总之:
# key(DT) = c("V1", "V2")
# data.frame | data.table equivalent
# =====================================================================
# subset(DF, (V1 == 3) & (V2 == 2)) | DT[J(3,2), nomatch=0L]
# subset(DF, (V1 == 3)) | DT[J(3), nomatch=0L]
# subset(DF, (V2 == 2)) | DT[J(unique(V1), 2), nomatch=0L]