Вот вариант с Map
res1 <- do.call(rbind, Map(function(x, y, z)
data.frame(foo[x:y,], ID = as.character(z), stringsAsFactors = FALSE),
findInterval(bar$xMin, foo$x),
findInterval(bar$xMax, foo$x), bar$ID))
all.equal(res1, res)
#[1] TRUE
Или с использованием data.table
library(data.table)
setDT(foo)[bar, on = .(x >= xMin, x <= xMax)]
Или с использованием tidyverse
library(dplyr)
library(purrr)
library(tidyr)
bar %>%
transmute(ID, col1 = map2(findInterval(xMin, foo$x),
findInterval(xMax, foo$x), ~
foo %>% slice(.x:.y))) %>%
unnest(c(col1))