2012-02-16 16 views
12

Matris A'da hangi satırların matris B'de bulunduğunu bulmanın hızlı bir yolu var mı? , ör.İki matris arasındaki satırların karşılaştırılması

m1 = matrix(c(1:6), ncol=2, byrow = T); m2 = matrix(c(1:4), ncol=2, byrow=T); 

ve sonuç 1 olur, 2.

matrisler sıra (sütun sayısı aynıdır), ve biraz büyük aynı sayıda yok - 10^6 - 10^7 satır sayısı.

şimdilik bildiğim bunu yapmanın en hızlı yolu, şöyledir:

duplicated(rbind(m1, m2)) 

Tnx!

+2

duplicated' 'Your çözüm de iki matrisin sadece birinde görünse bile, bir matris içinde tekrarlanan olsun tüm satırları dönecekti. Her neyse, MatthewDowle'in cevabı harika. –

+1

'data.table', daha hızlı olabilir çünkü" do.call "(" paste ") kaputun altında kullanılmaz. Eğer' M2 [M1] 'e çoğaltmayı tercih ederseniz' çoğaltılamaz (as.data.table (rbind (m1, m2))) 'aynı nedenle, daha hızlı olabilir. ilgileniyor senin zamanlamalarını görmek için. –

+0

@ David Oh evet,' duplicated' yaklaşımı hakkında iyi bir noktaya. –

cevap

21

o boyuta için hızlı bir yol olmalıdır: Ben orijinal kimliğini döndürür bu işlevi yarattı

require(data.table) 
M1 = setkey(data.table(m1)) 
M2 = setkey(data.table(m2)) 
na.omit(
    M2[M1,which=TRUE] 
) 
[1] 1 2 
-1

. Örneğin, matris x'i matris y ile eşleştirmek istiyorsanız, y'nin eşleşme kimliğini döndürür.

rowiseMatch2 <- function(x,y){ 
    require(data.table) 
    keycols <- colnames(x) 
    x <- cbind(x, id=1:nrow(x)) 
    y <- cbind(y, id=1:nrow(y)) 
    m1 = data.table(x) 
    setkeyv(m1, keycols) 
    m2 = data.table(y) 
    setkeyv(m2, keycols) 
    m1id <- m1$id 
    m2id <- m2$id 

    m1$id <- NULL 
    m2$id <- NULL 

    m <- na.omit(m2[m1,which=TRUE]) 
    mo <- m2id[m][order(m1id)] 

    if(length(mo) == nrow(x)){ 
    cat("Complete match!\n") 
    }else{ 
    cat("Uncomplete match, match percentage is:", round(length(mo)/nrow(x), 4)*100, "%\n") 
    } 
    return(as.integer(mo)) 
} 
İlgili konular