你可以试试data.tables二分查找
library(data.table)
setkey(setDT(data), X)[J(c(3, 4))]$ID
或%between%
setDT(data)[X %between% c(3, 4)]$ID
为什么?因为效率,例如:
set.seed(123)
n <- 1e7
ID <- seq_len(n)
X <- round(runif(n, 1, 10))
data <- data.frame(ID, X)
library(data.table)
library(microbenchmark)
all.equal(setkey(setDT(data), X)[J(c(3,4))]$ID, with(data, ID[X %in% c(3, 4)]))
## [1] TRUE
all.equal(with(data, ID[X %in% c(3, 4)]), setDT(data)[X %between% c(3, 4)]$ID)
## [1] TRUE
data2 <- copy(data)
microbenchmark(DTbinsearch = setkey(setDT(data2), X)[J(c(3, 4))]$ID,
DTbetween = setDT(data2)[X %between% c(3, 4)]$ID,
Richard1 = with(data, ID[X %in% c(3, 4)]),
Richard2 = with(data, ID[X == 3 | X == 4]))
# Unit: milliseconds
# expr min lq mean median uq max neval
# DTbinsearch 101.8367 103.9708 119.3839 107.0190 120.0599 266.7725 100
# DTbetween 322.0519 331.0178 352.8798 344.8267 373.1562 433.3817 100
# Richard1 465.2885 476.6722 505.3128 492.8427 525.6999 657.7406 100
# Richard2 521.2169 532.5552 554.0807 542.3962 573.8510 671.9143 100