【发布时间】:2014-05-20 09:24:05
【问题描述】:
在我看来,处理data.table 的行/列子集的最快方法是使用连接和nomatch 选项。
这对吗?
DT = data.table(rep(1:100, 100000), rep(1:10, 1000000))
setkey(DT, V1, V2)
system.time(DT[J(22,2), nomatch=0L])
# user system elapsed
# 0.00 0.00 0.01
system.time(subset(DT, (V1==22) & (V2==2)))
# user system elapsed
# 0.45 0.21 0.67
identical(DT[J(22,2), nomatch=0L],subset(DT, (V1==22) & (V2==2)))
# [1] TRUE
我对基于二分搜索的快速连接也有一个问题:我找不到一种方法来选择一维中的所有项目。
说如果我想随后做:
DT[J(22,2), nomatch=0] # subset on TWO dimensions
DT[J(22,), nomatch=0] # subset on ONE dimension only
# Error in list(22, ) : argument 2 is empty
无需将键重新设置为仅一维(因为我处于循环中,我不想每次都休息键)。
【问题讨论】:
-
这里有很好的关于常见 data.table 操作(包括子集)时序的文档:datatable.r-forge.r-project.org/datatable-timings.pdf
-
我查看了文档第 1.1 段提取。在我看来,除非添加 nomatch 选项,否则提取并不完全是子集。这也没有解决同时的 1 维和 2 维子集(请参阅我的更新问题)。
-
@tucson 这是两个完全不同的问题,需要不同的答案,所以他们应该有自己的帖子,但没关系。有关第二个问题的解决方案,请参阅 stackoverflow.com/questions/15597685/…。
标签: r data.table