测试列表是否与R

时间:2016-02-11 23:45:38

标签: r list

""和" 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  

2 个答案:

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