安德烈的回答很棒,而且我可能会使用。不过,有趣的是,以下构造似乎(只是有点)更快,尤其是随着 data.tables 大小的增加。
DT[J(x = unique(DT)[x!="a"][,x])]
##-------------------------------- Timings -----------------------------------##
library(data.table)
library(rbenchmark)
DT = data.table(x=rep(c("a","b","c"),each=45e5), y=c(1,3,6), v=1:9, key="x")
Josh <- function() DT[J(x = unique(DT)[x!="a"][,x])]
Andrie <- function() DT[-DT["a", which=TRUE]]
## Compare results
identical(Josh(), setkey(Andrie(), "x"))
# [1] TRUE
## Compare timings
benchmark(replications = 10, order="relative", Josh=Josh(), Andrie=Andrie())
test replications elapsed relative user.self sys.self user.child sys.child
1 Josh 10 17.50 1.000 14.78 3.6 NA NA
2 Andrie 10 18.75 1.071 16.52 3.2 NA NA
DT[,x]
如果可以返回data.table而不是向量,我会特别想使用它。然后,可以将构造简化为DT[unique(DT[,x])[x!="a"]]
. 此外,即使键中有多个列,它也可以工作,而它目前没有。