library(data.table)
Создать a
и b
a <- fread("
chr pos
chr2 10000
chr2 20000
chr2 45000
chr2 60000
chr2 80000
chr2 100000
", data.table = F)
b <- fread("
chr pos
chr2 10000
chr2 30000
chr2 40000
chr2 55000
chr2 80000
", data.table = F)
setDT(a)
setDT(b)
@ Метод Jaap, дополнительные столбцы не требуются
a[pos %inrange% b[, .(low = pos - 5000, high = pos + 5000)] & match(chr, b$chr)]
# chr pos
# 1: chr2 10000
# 2: chr2 45000
# 3: chr2 60000
# 4: chr2 80000
Присоединитьсяметод, требующий добавления дополнительных столбцов (тот же вывод)
Добавление границ для рассмотрения pos
"аналог"
a[, `:=`(low = pos - 5000, high = pos + 5000)]
Соединение b
с a
в соответствии сэти границы.
b[a, .(chr, pos), on = .(pos >= low, pos <= high, chr = chr), nomatch = 0]
метод SQL, дополнительные столбцы не требуются (тот же вывод)
library(sqldf)
sqldf("
select a.*
from a
inner join b
on a.chr = b.chr
and b.pos between a.pos - 5000 and a.pos + 5000
")