2016-06-09 82 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