在R中匹配两个矩阵列表(逐行)

时间:2016-06-09 20:59:17

标签: r list matrix

ab是两个列表,其中对象编号相同。 ab中包含的对象都是矩阵"。

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中的相应行进行比较,并计算有多少位置(在各列中)相同。

让我们以ab中的第二个对象为例。在a中,对象2是一个矩阵(ncol=3, nrow=2),我们需要将每一行与b中的第二个矩阵进行比较。 a的第二个对象中的第一行是2 1 2,我们可以看到第二个和第三个数字与b1 1 2)中的第二个对象相同,所以输出为2,然后我们不断使用第二行(1 1 2)进行比较,我们发现这三个数字与列表{{1中的对象2完全相同输出为b

预期结果如下:

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 。你能帮帮我吗?谢谢。或者是否有其他方法可以解决这个问题。谢谢!

1 个答案:

答案 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)