2013-08-15 11 views
5

Mamy dwa zestawy interwałów A i B. Przez pewien czas rozumiem uporządkowaną parę całkowitą, taką jak c(2,5). Chcę znaleźć wszystkie pary interwałów - jedną z A i jedną z B - które nakładają się na siebie.Znajdź parach pokrywających się przedziałów (segmentów)

Na przykład, jeśli A i B są następujące:

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

Następnie FindOverlap(A, B) należy zwrócić matrycy, jak poniżej (tylko zera elementem, ponieważ 3rd odstęp A nie pokrywa się z pierwszą przerwą B):

1 1 
1 1 
0 1 

Czy masz jakiś skuteczny pomysł?

Odpowiedz

6

Pakiet przedziały wydaje się stanowić rozwiązanie tutaj:

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) 

zobaczyć na miły demonstracji: Demo

HTH

+0

Cudownie! Dzięki – Ali

1

Oto mały funkcja pisałem zrobić to samo. Mogłoby to zostać poprawione w postaci zasadniczo. Interesujący problem jednak.

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

Dziękuję za odpowiedź. Jest to ciekawy pomysł wykorzystujący tylko podstawowe funkcje R, chociaż złożoność czasu to O (n * m * p), gdzie n to liczba elementów w A, m to liczba elementów w B, a p to maksymalna długość odstęp. – Ali

Powiązane problemy