Это решение, которое использует цикл для сравнения каждой строки/диапазон с предыдущим и использует функцию, чтобы определить дублирования.
# example dataset
dt = data.frame(region = 1:4,
min = c(1,20,101,220),
max = c(100,120,200,280))
# order data based on minimum value of range (in case you don't have an order already)
dt = dt[order(dt$min),]
dt
# region min max
# 1 1 1 100
# 2 2 20 120
# 3 3 101 200
# 4 4 220 280
# function that spots overlap
overlap = function(x,y) {
res = ifelse(x[2] >= y[1],1,0)
return(res)
}
# set starting point (row)
i = 2
# a loop that compares each row with the previous one and deletes row when it finds overlap
while(i <= nrow(dt)){
dt_temp = dt
if (overlap(dt_temp[i-1,2:3], dt_temp[i,2:3]) == 1) {dt_temp[i,]=NA; dt = dt_temp[complete.cases(dt_temp),]} else {dt = dt_temp; i = i+1}
}
dt
# region min max
# 1 1 1 100
# 3 3 101 200
# 4 4 220 280
Обратите внимание, что этот процесс зависит от первого (фиксированного) диапазона для расчета перекрытий. Итак, если у вас есть диапазоны [1, 100], [5,10], [15,30], [32,60], он вернет только [1,100], поскольку все остальные накладываются на него.
См., Например, http://web.mit.edu/r_v3.0.1/lib/R/library/IRanges/html/IntervalTree-class.html. –
Вы имеете в виду удалить минимальное количество регионов, чтобы не было перекрытий? – NicE