Вот вариант использования пакета data.table
:
library(data.table)
setDT(df_interval)
setDT(df_point)
df_interval[df_point, on=.(id, begin<=mid, end>=mid),
.(ID=id, point=i.point, mid=i.mid, interval=x.interval)]
Выход:
ID point mid interval
1: 1 X1 1100 AAA
2: 1 X2 2050 <NA>
3: 1 X3 3200 <NA>
4: 2 X4 4200 DDD
5: 2 X5 5500 <NA>
данные:
df_interval <- data.frame(id=c(1,1,2,2),
interval=c('AAA','BBB','CCC','DDD'),
begin=c(1000,2100,3100,4100),
end=c(2000,3000,4000,5000))
df_point <- data.frame(id=c(1,1,1,2,2),
point=c('X1','X2','X3','X4','X5'),
mid=c(1100,2050,3200,4200,5500))