Рассмотрим следующие data.table s. Первый определяет набор областей с начальным и конечным положениями для каждой группы
library(data.table)
d1 <- data.table(x=letters[1:5], start=c(1,5,19,30, 7), end=c(3,11,22,39,25))
setkey(d1, x,start)
#    x start end
# 1: a     1   3
# 2: b     5  11
# 3: c    19  22
# 4: d    30  39
# 5: e     7  25
Вторая представляет собой наблюдения для каждой группы
d2 <- data.table(x=letters[c(1,1,2,2,3:5)], pos=c(2,3,3,12,20,52,10))
setkey(d2, x,pos)
#    x pos
# 1: a   2
# 2: a   3
# 3: b   3
# 4: b  12
# 5: c  20
# 6: d  52
# 7: e  10
В конечном счете, я хотел бы иметь возможность извлекать строки в d2, которые находятся в области для соответствующего значения x в d1. Желаемый результат:
#    x pos start  end
# 1: a   2     1    3
# 2: a   3     1    3
# 3: c  20    19   22
# 4: e  10     7   25
Позиции начала/конца для любой группы x никогда не будут перекрываться, но могут быть пробелы значений не в какой-либо области.
Теперь я считаю, что должен использовать скользящее соединение. Из того, что я могу сказать, я не могу использовать столбец "end" в соединении.
Я пробовал
d1[d2, roll=T, nomatch=0, mult="all"][start<=end]
и получил
#    x start end
# 1: a     2   3
# 2: a     3   3
# 3: c    20  22
# 4: e    10  25
который является правильным набором строк, которые я хочу; Однако "pos" стал "стартом", и исходный "старт" был потерян. Есть ли способ сохранить все столбцы с объединением валов, чтобы я мог сообщать "start", "pos", "end" по желанию?
