2015-08-12 3 views
0

Данный файл:Как извлечь неперекрывающиеся диапазоны области «область» с помощью R?

Три столбца: ID, область слева и область справа.

region1 1 100 
region2 20 120 
region3 101 200 
region4 220 280 

Как я могу извлечь только области, которые не перекрываются? Чтобы получить:

region1 1 100 
region3 101 200 
region4 220 280 
+4

См., Например, http://web.mit.edu/r_v3.0.1/lib/R/library/IRanges/html/IntervalTree-class.html. –

+0

Вы имеете в виду удалить минимальное количество регионов, чтобы не было перекрытий? – NicE

ответ

0

Это решение, которое использует цикл для сравнения каждой строки/диапазон с предыдущим и использует функцию, чтобы определить дублирования.

# 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], поскольку все остальные накладываются на него.

Смежные вопросы