Используя data.table
, настройте образцы данных:
library(data.table)
A <- data.table(CHR = c(1,1,2,2,3,3), SNP = c('rs2073813', 'rs3131969', 'rs3131968', 'rs3131967', 'rs3115859', 'rs3131966'), POS = c(753541,754182,754192,754334,754503,900000))
B <- data.table(CHR = c(1,2,2,3), start = c(700500, 1000, 59998, 700000), end = c(833300, 20000, 60000, 800000))
Затем объедините A
и B
на CHR
:
merged_all <- merge(x = A, y = B, on = 'CHR')
Затем отфильтруйте объединенныеданные включают только строки и столбцы, которые соответствуют вашим критериям:
out <- merged_all[(POS > start & end > POS), .(CHR, SNP, POS)]
> out
CHR SNP POS
1: 1 rs2073813 753541
2: 1 rs3131969 754182
3: 3 rs3115859 754503
Редактировать:
Обновление с гораздо более эффективным вариантом:
out <- A[B, on = .(CHR, POS >= start, POS <= end), .(CHR, SNP, POS), nomatch = 0]
> out
CHR SNP POS
1: 1 rs2073813 700500
2: 1 rs3131969 700500
3: 3 rs3115859 700000
Это соединяет таблицы напрямую.
Примечание: неясно, требуются ли вам инклюзивные или эксклюзивные диапазоны (>
или >=
).Вы можете настроить соответственно.