【问题标题】:How do I get the intersect of two matrices?如何获得两个矩阵的交集?
【发布时间】:2025-12-27 15:00:11
【问题描述】:
# These are the two matrices that I would like to subset based on identical
# entries within entire rows.
mata <- matrix(c("A", "B", "C", "F", "D", "E", "F", "G"), 
               nrow = 4, ncol = 2,
               dimnames = list(c(), c("A", "B")))
mata

##      A   B  
## [1,] "A" "D"
## [2,] "B" "E"
## [3,] "C" "F"
## [4,] "F" "G"

matb <- matrix(c("B", "A", "C", "F", "M", "D", "D", "H", "G", "X"), 
               nrow = 5, ncol = 2,
               dimnames = list(c(), c("A", "B")))
matb

##      A   B  
## [1,] "B" "D"
## [2,] "A" "D"
## [3,] "C" "H"
## [4,] "F" "G"
## [5,] "M" "X"

如果两个矩阵不是无序的且长度相同,则 以下代码应该可以工作并且效率很高。

mata[rowMeans(mata == matb) == 1, ]

我的一个骇人听闻的解决方案是连接个人 我想用于匹配的每个矩阵的列。在这个 示例我将使用所有列。

mata <- cbind(mata, C = paste0(mata[, "A"], "_", mata[, "B"]))
matb <- cbind(matb, C = paste0(matb[, "A"], "_", matb[, "B"]))
mata[mata[, "C"] %in% matb[, "C"], colnames(mata) != "C"]

##      A   B  
## [1,] "A" "D"
## [2,] "F" "G"

这是我正在寻找的结果,但我想知道是否 还有一些更优雅的东西,例如向量的%in% 函数。

编辑

该解决方案应适用于矩阵不存在的一般情况 必须等长。

【问题讨论】:

    标签: r matrix match


    【解决方案1】:

    您可以为此使用函数merge()

    > merge(mata,matb)
      A B
    1 A D
    2 F G
    

    【讨论】:

      【解决方案2】:

      如果加载 dplyr,则会添加 intersect.data.frame

      library(dplyr)
      options(stringsAsFactors=FALSE)
      dfa <- as.data.frame(mata)
      dfb <- as.data.frame(matb)
      intersect(dfa,dfb)
      
      #   A B
      # 1 A D
      # 2 F G
      

      同样,unionsetequal(测试集相等)和setdiff(负集)也可用。


      除此之外。 data.frame 的每一行都对应一个观察结果,因此谈论相交的两组观察结果(两个 data.frames)是有意义的。然而,对于矩阵,它确实没有意义。这就是为什么如果您想继续使用矩阵,此操作需要像 OP 的解决方案和 @RHertel 的(在幕后强制转换为 data.frame)这样的黑客。

      【讨论】:

      • 加载一个外部包,创建副本并转换为两个数据集的data.frame,只是为了尝试新的闪亮intersect.data.frame? :)
      • @DavidArenburg 是的,我可以看到这个观点。另一方面,我非常坚持使用我认为“正确”的数据格式:),如果涉及集合操作,我认为矩阵是错误的。
      最近更新 更多