在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 中相应行的值之一。
例如,您想查看 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 的两个数字进行比较,而不是逐个单元格进行比较。
我非常感谢您的帮助!
您可以在A
的行索引上使用sapply()
,如下所示:
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