r - data.table 选择键不等于值的行

标签 r data.table

考虑这个 data.table:

DT <- data.table(mtcars)
setkey(DT, am, gear)

如何选择 am == 1 & gear != 4 的行使用快速二进制索引?

例如我认为选择一行说 am == 1 & gear == 4使用快速二进制索引,我这样做:
DT[.c(1, 4)]

最佳答案

从头重写

https://cran.r-project.org/web/packages/data.table/vignettes/datatable-keys-fast-subset.html .栏目 4) 二分搜索 vs 向量扫描 指出,例如,以下

flights[origin == "JFK" & dest == "MIA"]

将得到,我引用,自动优化以使用二分搜索。

但是!,我冒昧地修改了他们包含的示例并将选择与否定进行了比较,正如您所尝试的那样,结果并不是那么好:/
N = 2e7L
DT = data.table(x = sample(letters, N, TRUE),
                y = sample(1000L, N, TRUE),
                z = sample(c(T, F), N, TRUE, probs=c(0.00001, 0.99999)),
                val = runif(N))
key(DT) # should be null
t1 <- system.time(ans1 <- DT[z == T & x == "g"])
t2 <- system.time(ans1 <- DT[z != F & x == "g"])
setkey(DT, x, z)
t3 <- system.time(ans1 <- DT[z == T & x == "g"])
t4 <- system.time(ans1 <- DT[z != F & x == "g"])

在我的机器上,结果如下:
> t1
user  system elapsed 
0.464   0.001   0.124 
> t2
user  system elapsed 
0.169   0.000   0.169 
> t3
user  system elapsed 
0.002   0.000   0.002  
> t4
user  system elapsed 
0.168   0.000   0.167 

似乎如果选择中有否定,我们不仅不使用快速二进制搜索,而且我们也只使用一个核心(比较 t1 和 t2 - 用户和耗时)。在这种情况下,如果选择不使用否定并且设置了键,我们只会获得疯狂的二进制性能。这令人失望,甚至可能是一个错误?

关于r - data.table 选择键不等于值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58503964/

相关文章:

r - 如何从数据框中创建组合箱线图?

r - 将参数存储在对象中并在函数中调用

r - 如果 nrow=0,如何将空行添加到 data.table?

r - 如何在 data.table 中使用 OR 条件连接表

r - 在 R 中拆分数据框时删除列

根据条件替换为列中的多个元素

r - 在 ggplot 中的何处以及如何应用过滤器

r - 如何使用 dplyr 中的累积函数在 R 中按行重现数据帧或 tibble?

r - 是否有一种 RAM 有效的方法来计算补集的中位数?

python - 相当于 R data.table 的 pandas dataframe