""和" b"列表。
a<-list(matrix(c(0,2,0,0,0,2,0,0,1,0,0,0,0,0,2,1),4), matrix(c(0,1,0,0,0,2,1,0,0,0,1,0),3), matrix(c(0,0,0,0,2,0,1,0,0,0,0,0,2,0,2,1,0,1,2,0),5))
b<-list(matrix(c(2,2,1,1),1),matrix(c(1,2,1,2),1),matrix(c(2,1,2,1),1))
>a
[[1]]
[,1] [,2] [,3] [,4]
[1,] 0 0 1 0
[2,] 2 2 0 0
[3,] 0 0 0 2
[4,] 0 0 0 1
[[2]]
[,1] [,2] [,3] [,4]
[1,] 0 0 1 0
[2,] 1 0 0 1
[3,] 0 2 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 2
[5,] 2 0 2 0
> b
[[1]]
[,1] [,2] [,3] [,4]
[1,] 2 2 1 1
[[2]]
[,1] [,2] [,3] [,4]
[1,] 1 2 1 2
[[3]]
[,1] [,2] [,3] [,4]
[1,] 2 1 2 1
列表中有三个对象&#34; a&#34;和&#34; b&#34;。
我的目标是测试列表中每行中的非零元素&#34; a&#34;匹配列表中对应对象的对应位置&#34; b&#34;。
例如,&#34; a&#34;中的第一个对象是:
[[1]]
[,1] [,2] [,3] [,4]
[1,] 0 0 1 0
[2,] 2 2 0 0
[3,] 0 0 0 2
[4,] 0 0 0 1
&#34; b&#34;中的第一个对象是:
[[1]]
[,1] [,2] [,3] [,4]
[1,] 2 2 1 1
我们可以在列表的第1行中看到非零数字&#34; a&#34;是1,它位于行的第三位,第三个位于&#34; b&#34;也是3,所以我们称之为匹配!结果应该是&#34; TRUE&#34;
列表的第2行中的非零数字&#34; a&#34;是2 2,它们位于行的第一和第二位置,第一个对象的第一个和第二个位置在&#34; b&#34;也是2 2,所以我们称之为匹配!结果也应该出现&#34; TRUE&#34;。 ......等等。
所以预期的结果应该是:
[[1]]
[,1]
[1,] TRUE
[2,] TRUE
[3,] FALSE
[4,] TRUE
[[2]]
[,1]
[1,] TRUE
[2,] FALSE
[3,] TRUE
[[3]]
[,1]
[1,] TRUE
[2,] TRUE
[3,] TRUE
[4,] FALSE
[5,] TRUE
答案 0 :(得分:2)
mapply(function(x, y) rowSums(!(t(t(x) == c(y)) | x == 0)) == 0, a, b)
# [[1]]
# [1] TRUE TRUE FALSE TRUE
#
# [[2]]
# [1] TRUE FALSE TRUE
#
# [[3]]
# [1] TRUE TRUE TRUE FALSE TRUE
答案 1 :(得分:2)
这是一个想法。这会针对b
中相应矩阵的每一行检查每个a
向量,每个行都带有零。匹配为TRUE,否则为FALSE。
f <- function(x, y) {
matrix(apply(x, 1, function(z) identical(y[z != 0], z[z != 0])))
}
Map(f, a, b)
# [[1]]
# [,1]
# [1,] TRUE
# [2,] TRUE
# [3,] FALSE
# [4,] TRUE
#
# [[2]]
# [,1]
# [1,] TRUE
# [2,] FALSE
# [3,] TRUE
#
# [[3]]
# [,1]
# [1,] TRUE
# [2,] TRUE
# [3,] TRUE
# [4,] FALSE
# [5,] TRUE