【问题标题】:Comparing rows between two matrices比较两个矩阵之间的行
【发布时间】:2012-03-08 04:27:12
【问题描述】:

有没有一种快速的方法可以找到矩阵 A 中的哪些行存在于矩阵 B 中? 例如

m1 = matrix(c(1:6), ncol=2, byrow = T); m2 = matrix(c(1:4), ncol=2, byrow=T);

结果将是 1、2。

矩阵的行数不同(列数相同),而且它们有些大 - 从 10^6 - 10^7 行数。

据我所知,最快的方法是:

duplicated(rbind(m1, m2))

Tnx!

【问题讨论】:

  • 您使用duplicated 的解决方案也将返回在矩阵中重复的任何行,即使它只出现在两个矩阵之一中。无论如何,@MatthewDowle 的回答很棒。
  • data.table 可能会更快,因为它在后台不使用do.call("paste"。如果您更喜欢 duplicated 而不是 M2[M1],那么出于同样的原因,duplicated(as.data.table(rbind(m1,m2))) 可能会更快。有兴趣看看你的时间安排。
  • @David 哦,是的,关于duplicated 方法的要点。
  • 重复? stackoverflow.com/questions/7943695/matrix-in-matrix(或者,至少,“在这里寻找其他选项!”)

标签: r matrix


【解决方案1】:

这种尺寸的快速方法应该是:

require(data.table)
M1 = setkey(data.table(m1))
M2 = setkey(data.table(m2))
na.omit(
    M2[M1,which=TRUE]
)
[1] 1 2

【讨论】:

    【解决方案2】:

    我创建了这个函数,它将返回原始 ID。比如你想匹配矩阵 x 和矩阵 y,它会返回 y 的匹配 ID。

    rowiseMatch2 <- function(x,y){
      require(data.table)
      keycols <- colnames(x)
      x <- cbind(x, id=1:nrow(x))
      y <- cbind(y, id=1:nrow(y))
      m1 = data.table(x)
      setkeyv(m1, keycols)
      m2 = data.table(y)
      setkeyv(m2, keycols)
      m1id <- m1$id
      m2id <- m2$id
    
      m1$id <- NULL
      m2$id <- NULL
    
      m <- na.omit(m2[m1,which=TRUE])
      mo <- m2id[m][order(m1id)]
    
      if(length(mo) == nrow(x)){
        cat("Complete match!\n")
      }else{
        cat("Uncomplete match, match percentage is:", round(length(mo)/nrow(x), 4)*100, "%\n")
      }
      return(as.integer(mo))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      相关资源
      最近更新 更多