R data.table使用键与!(不是)效率

R data.table使用键与!(不是)效率,r,data.table,key,R,Data.table,Key,我打赌这有一个简单的答案,但是当您想要不等于特定值的值时,是否有更好的方法使用R data.table键 在下面的代码示例中,我希望值不等于205,您可以使用看到这一点即使返回相同数量的行,也需要3倍的时间。在这个简单的示例中,您可以将其设置为100,或者执行一个fsetdiff()之类的操作,但是可以想象一个非常大的表,其中包含许多ID值 N = 2e7L DT = data.table(id = sample(c(100L, 205L), N, TRUE), loan_age = sa

我打赌这有一个简单的答案,但是当您想要不等于特定值的值时,是否有更好的方法使用R data.table键

在下面的代码示例中,我希望值不等于205,您可以使用
看到这一点即使返回相同数量的行,也需要3倍的时间。在这个简单的示例中,您可以将其设置为100,或者执行一个
fsetdiff()
之类的操作,但是可以想象一个非常大的表,其中包含许多ID值

N = 2e7L
DT = data.table(id = sample(c(100L, 205L), N, TRUE),
   loan_age = sample(0:500, N, TRUE),
   val = runif(N))

setkey(DT, id)
system.time(DT[.(205L)])  #0.108
system.time(DT[!.(205L)]) #0.396

使用
DT[DT[,.I[id!=205L]]]
会使我比(205L)`花费的时间少,而且也没有
setkey
,哇,这不是我会考虑的语法!我当时看到0.247(带或不带设置键)。我仍然有点惊讶,没有一种方法可以使用该键使时间接近0.108,但这肯定是一种改进(可能是最好的?)。如果你回答,我会接受。在你的system.time中,你没有考虑设置键的时间。用它,然后你会发现这是更快速的愚蠢的解决办法将是。。。在ID205上连接,然后省略行(如果有):
system.time({w