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

R data.table选择键不等于值的行,r,data.table,R,Data.table,考虑以下数据表: DT <- data.table(mtcars) setkey(DT, am, gear) 从头重写 。第4)节二进制搜索与向量扫描的比较指出,例如: flights[origin == "JFK" & dest == "MIA"] 将得到,我引述,自动优化使用二进制搜索 然而!,我随意修改了他们的示例,并将选择与否定进行了比较,正如您尝试的那样,结果并不太好:/ N = 2e7L DT = data.table(x = sample(letters, N,

考虑以下数据表:

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

从头重写

。第4)节二进制搜索与向量扫描的比较指出,例如:

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和t2-用户和运行时间)。在这个场景中,我们只有在选择不使用否定且设置了键的情况下才能获得疯狂的二进制性能。这是令人失望的,甚至可能是一个bug?

第二个问题(“我认为它也应该使用二进制排序”)的答案是我想更确定的
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