2013-08-15 43 views
5

Chúng tôi có hai khoảng thời gian AB. Theo một khoảng thời gian, tôi có nghĩa là một cặp số nguyên theo thứ tự như c(2,5). Tôi muốn tìm tất cả các khoảng thời gian - một từ A và một từ B - có chồng chéo.Tìm chồng chéo nhau theo từng khoảng thời gian (phân đoạn)

Ví dụ nếu A và B như sau:

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

Sau đó FindOverlap(A, B) nên trả về một ma trận như dưới đây (yếu tố duy nhất không là bởi vì khoảng thời gian thứ 3 của A không trùng với khoảng thời gian đầu tiên của B):

1 1 
1 1 
0 1 

Bạn có ý tưởng nào hiệu quả không?

Trả lời

6

Gói khoảng dường như để cung cấp một giải pháp ở đây:

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) 

xem cho một cuộc biểu tình đẹp: Demo

hth

+0

Tuyệt vời! Cảm ơn bạn – Ali

1

Dưới đây là một chức năng nhỏ tôi đã viết để làm điều tương tự. Nó có thể được cải thiện đáng kể. Vấn đề thú vị mặc dù.

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

Cảm ơn câu trả lời của bạn. Đó là một ý tưởng thú vị chỉ sử dụng các khả năng R cơ bản, mặc dù độ phức tạp thời gian là O (n * m * p) trong đó n là số mục trong A, m là số lượng các mục trong B, và p là độ dài tối đa của Một khoảng. – Ali

Các vấn đề liên quan