“a”是列表,“b”是矩阵。
a<-list(matrix(c(0,2,0,1,0,2,0,0,1,0,0,0,0,0,2,2),4),
matrix(c(0,1,0,0,0,1,1,0,0,0,0,0),3),
matrix(c(0,0,0,0,2,0,1,0,0,0,0,0,2,0,2,1,0,1,1,0),5))
b<-matrix(c(2,2,1,1,1,2,1,2,1,1,2,1,1,1,1,1,1,2,2,2,1,2,1,1),6)
> a
[[1]]
[,1] [,2] [,3] [,4]
[1,] 0 0 1 0
[2,] 2 2 0 0
[3,] 0 0 0 2
[4,] 1 0 0 2
[[2]]
[,1] [,2] [,3] [,4]
[1,] 0 0 1 0
[2,] 1 0 0 0
[3,] 0 1 0 0
[[3]]
[,1] [,2] [,3] [,4]
[1,] 0 0 0 1
[2,] 0 1 0 0
[3,] 0 0 2 1
[4,] 0 0 0 1
[5,] 2 0 2 0
> b
[,1] [,2] [,3] [,4]
[1,] 2 1 1 2
[2,] 2 2 1 2
[3,] 1 1 1 1
[4,] 1 1 1 2
[5,] 1 2 1 1
[6,] 2 1 2 1
列表“a”中有 3 个对象。我想测试是否所有non-zero列表“a”中每个对象中的元素与矩阵“b”中同一行的相应位置匹配。如果匹配,则输出b的匹配行号。
例如,第二个对象是
[[2]]
[,1] [,2] [,3] [,4]
[1,] 0 0 1 0
[2,] 1 0 0 0
[3,] 0 1 0 0
可以看到,第一行的非零数为1,位于该行的第三位,可以匹配矩阵b的1-5行,第二行的非零数为1,位于该行第1位,可以匹配矩阵b的3-5行,第3行非零数为1,位于该行第2位,它可以匹配矩阵“b”的3-4行。因此只有矩阵“b”的第3行或第4行可以匹配该对象中的所有行,因此输出结果为“3 4”。
我的尝试代码如下:
temp<-Map(function(y) t(y), Map(function(a)
apply(a,1,function(x){
apply(b,1, function(y) identical(x[x!=0],y[x!=0]))}),a))
lapply(temp, function(a) which(apply(a,2,prod)==1))
结果如下:
[[1]]
integer(0)
[[2]]
[1] 3 4
[[3]]
[1] 6
这是正确的。但我想知道是否有更快速的代码来处理这个问题?