在R中,假设你有一个矩阵A:
A <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18), nrow=6, ncol=3)
和另一个矩阵B:
B <- matrix(c(1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15, 17), nrow=6, ncol=2)
并且您希望看到,如果在每一行中,A中的值是B中相应行的值之一,则通过单独检查每个值。
E.g。您希望查看A(1,7,13)的第一行中的值是否等于1或7(B的第一行)。
你怎么能这样做?
我的问题是,两个矩阵的大小不一样,我想得到A大小的矩阵,其中包含TRUE或FALSE。
例如:此结果矩阵C的第一行将为(TRUE,TRUE,FALSE),因为1等于1或7,7等于1或7,但13不等于1或7。
我尝试使用%in%的解决方案,但由于我对R很新,我无法找到,如何将它应用于每一行而不仅仅是第一行。带有“==”的解决方案也不起作用,因为矩阵没有相同的大小,我想比较A的每个单元格和B的数量,而不是逐个单元格。
我真的很感谢你的帮助!
答案 0 :(得分:1)
您可以在sapply()
的行索引上使用A
,如下所示:
sapply(seq(length = nrow(A)), function(x) A[x, ] %in% B[x, ])
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] TRUE TRUE TRUE TRUE TRUE TRUE
#> [2,] TRUE FALSE FALSE FALSE FALSE FALSE
#> [3,] FALSE FALSE FALSE FALSE FALSE FALSE
这会产生一个矩阵,其中每列对应A
中的一行。要转置它,您可以使用t()
t(sapply(seq(length = nrow(A)), function(x) A[x, ] %in% B[x, ]) )
#> [,1] [,2] [,3]
#> [1,] TRUE TRUE FALSE
#> [2,] TRUE FALSE FALSE
#> [3,] TRUE FALSE FALSE
#> [4,] TRUE FALSE FALSE
#> [5,] TRUE FALSE FALSE
#> [6,] TRUE FALSE FALSE