【问题标题】:How to compare if the values of a data frame A contain one of the values of data frame B?如何比较数据框 A 的值是否包含数据框 B 的值之一?
【发布时间】:2018-06-08 15:21:42
【问题描述】:

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

非常感谢您的帮助!

【问题讨论】:

    标签: r dataframe matrix compare


    【解决方案1】:

    您可以像这样在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
    

    【讨论】:

    • 非常好,非常感谢!这正是我想要的,尽管我还没有完全理解 sapply() 的工作原理。 seq 代表应该多久应用一次函数,对吧?并且 length = nrow(A) 计算用作函数重复频率的行数,对吗?那么 x 代表什么?
    • seq() 创建一个数字序列,矩阵A 的每一行对应一个数字。 sapply() 然后为每个数字应用一个函数。在这种情况下,我们定义了自己的函数function(x) A[x, ] %in% B[x, ],其中x 是行号,它用于子集ABsapply()seq() 中的每个值作为 x 传递给函数。
    • 非常感谢,你让我开心!
    猜你喜欢
    • 2013-06-03
    • 2023-03-20
    • 1970-01-01
    • 2015-01-24
    • 2022-08-07
    • 2018-01-01
    • 2019-09-21
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多