Рассмотрим следующие 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" по желанию?