2012-10-02 66 views
3

value matching functionR中非常有用。但根據我的理解,它不足以支持兩個或高維度的輸入。在R中,匹配矩陣行或列的函數

例如,假設xy是相同的列數的矩陣,並且我想匹配的x行的y行。 'R'函數調用match(x,y)不這樣做。列表輸入發生同樣的不足。

我已經實現了我自己的版本,名爲matchMat(xMat, yMat)(附後),但我想知道你對這個任務有什麼解決方案。

matchMat = function(xMat, uMat, dimn=1) { 
    ind = rep(-1, dim(xMat)[dimn]) 
    id = 1 : dim(uMat)[dimn] 
    for (i in id) { 
     e = utilSubMat(i, uMat, dimn) 
     isMatch = matchVect(e, xMat, dimn) 
     ind[isMatch] = i 
    } 
    return(ind) 
} 

matchVect = function(v, xMat, dimn) { 
    apply(xMat, dimn, function(e) { 
     tf = e == v 
     all(tf) 
    }) 
} 

unittest_matchMat = function() { 
    dimn = 1 
    uMat = matrix(c(1, 2, 2, 3, 3, 4, 4, 5), ncol=2, byrow=T) 
    ind = sample(dim(uMat)[1], 10, replace=T) 
    print(ind) 
    xMat = uMat[ind, ] 
    rst = matchMat(xMat, uMat, dimn) 
    print(rst) 
    stopifnot(all(ind == rst)) 

    xMat2 = rbind(c(999, 999), xMat, c(888, 888)) 
    rst2 = matchMat(xMat2, uMat, dimn) 
    print(rst2) 
    stopifnot(all(c(-1, ind, -1) == rst2)) 
    print('pass!') 
} 

回答

10

match將對原子矢量的list s起作用。因此,要匹配一個矩陣的行到另一個,你可以這樣做:

match(data.frame(t(x)), data.frame(t(y))) 

t調換行成列,然後data.frame會在轉置矩陣的列的list

1

你能做到這一點不使用任何功能:

假設adj13*3矩陣既colnamesrow.namesc('V1','V2','V3')vec1是你希望你的矩陣改造成的順序:

vec1 <- c('V2','V3','V1') 

你可以簡單地使用下面的代碼:

adj1[vec1,vec1] 

哪個會對你有所幫助。

乾杯!

0

你可以使用apply

z <- apply(x, 1, function(a) apply(y, 1, function(b) all(a==b))) 

這將產生與nrow(x)行和列nrow(y),其條目標註那裏有一個匹配的指數矩陣。

1

prodlim中的函數row.match允許您識別一個矩陣中也在另一個矩陣中找到(相同)的行。非常方便和易於使用。

library(prodlim) 
row.match(x,y)