r语言 - 如何比较数据框 A 的值是否包含数据框 B 的值之一?



在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

相关内容

  • 没有找到相关文章

最新更新