2016-06-09 66 views
2

ab是兩個列表,其中對象編號相同。含在兩個ab的對象是矩陣」。在R中匹配兩個矩陣列表(明智地)R

a<-list(matrix(c(1,2,2),1,3),matrix(c(2,1,1,1,2,2),2,3),matrix(,0,3)) 
b<-list(matrix(c(2,2,2),1,3),matrix(c(1,1,2),1,3),matrix(c(1,2,1),1,3)) 
> a 
[[1]] 
    [,1] [,2] [,3] 
[1,] 1 2 2 

[[2]] 
    [,1] [,2] [,3] 
[1,] 2 1 2 
[2,] 1 1 2 

[[3]] 
    [,1] [,2] [,3] 

> b 
[[1]] 
    [,1] [,2] [,3] 
[1,] 2 2 2 

[[2]] 
    [,1] [,2] [,3] 
[1,] 1 1 2 

[[3]] 
    [,1] [,2] [,3] 
[1,] 1 2 1 

從上面,我們可以看到在ab有3個對象(即基體)。在列表a在每個矩陣的行數而變化,而在列表b的每個矩陣的行數是相同的(nrow=1)。我想的a比較每列與b相應的行,並計算出有多少位置(各列)是相同的。

我們來看看中的第二個對象例如,和b。在a中,對象2是一個矩陣(ncol=3, nrow=2),我們需要將每行與b中的第二個矩陣進行比較。 a的第二個對象中的第一行是2 1 2,我們可以看到第二個和第三個數字與b1 1 2)中的第二個對象相同,所以輸出是2,然後我們繼續使用第二行(1 1 2)作爲比較,我們發現三個數字與列表b中的對象2都是相同的,所以輸出是3

預期的結果如下:

[[1]] 
[1] 2 

[[2]] 
[1] 2 3 

[[3]] 
[1] 0 

我用下面的代碼來計算:

Map(function(a,b) matrix(sapply(1:3, function(x) {a[,x]==b[,x]}),ncol=3),a,b) 

[[1]] 
     [,1] [,2] [,3] 
[1,] FALSE TRUE TRUE 

[[2]] 
     [,1] [,2] [,3] 
[1,] FALSE TRUE TRUE 
[2,] TRUE TRUE TRUE 

[[3]] 
    [,1]  [,2]  [,3]  
[1,] Logical,0 Logical,0 Logical,0 

但我不知道怎麼去總結的結果,因爲在第三個對象中是Logical,0。你能幫我解決這個問題嗎?謝謝。或者是否有其他方法來解決這個問題。謝謝!

回答

3

下面是一個選項:

Map(function(x,y) apply(x, 1, function(z) rowSums(z == y)), a, b) 
#[[1]] 
#[1] 2 
# 
#[[2]] 
#[1] 2 3 
# 
#[[3]] 
#numeric(0) 
+0

尼斯解決方案,但它僅適用於OP的例子,並不用於'一個=列表(結構(C(1,2,2),.dim僞= C(1L, 3L)),結構(c(2, ,1,1,1,2,2),.Dim = 2:3),結構(c(1,2,3,2,5,3, 2 ,1),.Dim = c(3L,3L))); b = list(結構(c(2,2,2),.dim = c(1L,3L)),結構(c(1,0.1,2),.Dim = c(1L,3L)),結構(c(1,2,1,3,1,3),.Dim = 2:3))' – 989

+0

@ m0h3n,OP指定「列表b的每個矩陣中的行號相同(nrow = 1)」 –

+0

ahaaa。投了票 – 989