比较两个矩阵之间的行

时间:2012-02-16 18:29:41

标签: r matrix

有没有一种快速的方法可以找到矩阵B中哪些行存在于矩阵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!

2 个答案:

答案 0 :(得分:23)

这种规模的快速方法应该是:

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

答案 1 :(得分:-1)

我创建了这个函数,它将返回原始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))
}