如何比较数据帧A的值是否包含数据帧B的值之一?

时间:2018-06-08 15:21:42

标签: r dataframe matrix compare

在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的数量,而不是逐个单元格。

我真的很感谢你的帮助!

1 个答案:

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