Assume you have vector numeric vector x and a data frame df with columns start and stop. Is there a clever way to return a logical vector with length equal to x indicating if x is in at least one interval defined by start or stop ?
The actual case I'm working with has length(x) >> nrow(df). The naïve way to do this would be using a for loop but I was hoping for something more elegant and that runs fast.
x <- 1:10
df <- data.frame(start = c(0, 4.5, 6), stop = c(1, 5.5, 8.5))
z <- rep(FALSE, length(x))
for(i in 1:nrow(df)){
z <- z | (df$start[i] <= x & x <= df$stop[i])
}
x[z] # 1 5 6 7 8
Maybe you can use outer like below
> with(df, x[rowMeans(outer(x, start, `>=`) & outer(x, stop, `<=`)) > 0])
[1] 1 5 6 7 8
or, you can use %inrange% from data.table
> library(data.table)
> x[x %inrange% df]
[1] 1 5 6 7 8