2012-02-16 6 views
12

के बीच पंक्तियों की तुलना करना क्या मैट्रिक्स बी में कौन सी पंक्तियां मैट्रिक्स बी में मौजूद हैं, यह जानने का एक तेज़ तरीका है? उदा।दो मैट्रिस

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

और परिणाम 1 होगी, 2.

मैट्रिक्स पंक्तियाँ (स्तंभों की संख्या में एक ही है), और वे कुछ हद तक बड़े हैं की एक ही नंबर की जरूरत नहीं है - 10^6 से - 10^पंक्तियों की संख्या 7।

यह ऐसा करने का सबसे तेज़ तरीका है, कि मैं अब के लिए के बारे में पता है:

duplicated(rbind(m1, m2)) 

Tnx!

+2

'duplicated' साथ आपका समाधान भी कोई पंक्ति एक मैट्रिक्स के भीतर दोहराया वापसी होगी, भले ही वह दो मैट्रिक्स से केवल एक में प्रकट होता है। वैसे भी, @ मैथ्यूडॉएल का जवाब बहुत अच्छा है। –

+1

'data.table' तेज़ हो सकता है क्योंकि यह हुड के नीचे 'do.call (" पेस्ट "' का उपयोग नहीं करता है। यदि आप' एम 2 [एम 1] 'के लिए' डुप्लिकेट 'पसंद करते हैं तो 'duplicated (as.data.table (rbind (एम 1, एम 2))) 'तेजी से, एक ही कारण के लिए इच्छुक अपने समय को देखने के लिए हो सकता है।। –

+0

@ दाऊद अरे हाँ,' duplicated' दृष्टिकोण के बारे में अच्छी बात। –

उत्तर

21

है कि आकार के लिए एक तेजी से किया जाना चाहिए:

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

मैं इस समारोह जो मूल आईडी वापस आ जाएगी बनाया। उदाहरण के लिए आप मैट्रिक्स एक्स से मैट्रिक्स वाई से मिलान करना चाहते हैं, यह वाई की मैच आईडी वापस कर देगा।

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)) 
} 
संबंधित मुद्दे