2013-08-15 11 views
5

Vengono forniti due set di intervalli A e B. Per intervallo intendo una coppia ordinata di numeri interi come c(2,5). Voglio trovare tutte le coppie di intervalli - uno da A e uno da B - che si sono sovrapposti.Trova sovrapposizioni di intervalli a coppie (segmenti)

Per esempio, se A e B sono come segue:

A=c(c(1,7), c(2,5), c(4, 16)) 
B=c(c(2,3), c(2,20)) 

Poi FindOverlap(A, B) deve restituire una matrice come qui di seguito (l'unico elemento zero è perché l'intervallo di 3a di A non si sovrappone con il primo intervallo di B):

1 1 
1 1 
0 1 

Avete un'idea efficiente?

risposta

6

Il pacchetto intervalli sembra fornire una soluzione qui:

require("intervals") 
A=rbind(A1=c(1,7), A2=c(2,5), A3=c(4, 16)) 
B=rbind(B1=c(2,3), B2=c(2,20)) 

# here you can also define if it is an closed or open interval 
Aint<-Intervals(A) 
Bint<-Intervals(B) 

# that should be what you are looking for  
interval_overlap(Aint, Bint) 

vedere per una bella dimostrazione: Demo

hth

+0

Meraviglioso! Grazie – Ali

1

Ecco un po 'la funzione che ho scritto a fare la stessa cosa. Potrebbe essere migliorato sostanzialmente. Problema interessante però.

f <- function(A,B){ 
    tmpA <- lapply(A , function(x) min(x):max(x)) 
    tmpB <- lapply(B , function(x) min(x):max(x)) 
    ids <- expand.grid(seq_along(tmpA) , seq_along(tmpB)) 
    res <- mapply(function(i,j) any(tmpA[[i]] %in% tmpB[[j]]) , i = ids[,1] , j = ids[ ,2]) 
    out <- matrix(res , nrow = length(tmpA)) 
    return(out * 1) 
    } 

f(A,B) 
    [,1] [,2] 
[1,] 1 1 
[2,] 1 1 
[3,] 0 1 
+0

Grazie per la risposta. È un'idea interessante usare solo le capacità R di base, sebbene la complessità temporale sia O (n * m * p) che n è il numero di elementi in A, m è il numero di elementi in B, e p è la lunghezza massima di un intervallo. – Ali