Опция путем установки ключа и использования неэкви-соединения в data.table
:
library(data.table)
setDT(RangesList, key=c("Start", "End"))
RangesList[.(v=Numbers), on=.(Start<=v, End>=v), mult="first", by=.EACHI, .N > 0L]$V1
временный код:
set.seed(0L)
nn <- 100e3
nr <- 2e3
Numbers <- rnorm(nn)
s <- rnorm(nr); e <- rnorm(nr)
RangesList <- data.frame(Start=pmin(s, e), End=pmax(s, e))
library(data.table)
microbenchmark::microbenchmark(times=1L,
base = abase <- sapply(Numbers, function(x) any(x >= RangesList$Start & x <= RangesList$End)),
dt = adt <- {
setDT(RangesList, key=c("Start", "End"))
RangesList[.(v=Numbers), on=.(Start<=v, End>=v), mult="first", by=.EACHI, .N > 0L]$V1
}
)
identical(abase, adt)
#[1] TRUE
время:
Unit: milliseconds
expr min lq mean median uq max neval
base 2338.6214 2338.6214 2338.6214 2338.6214 2338.6214 2338.6214 1
dt 804.2691 804.2691 804.2691 804.2691 804.2691 804.2691 1