R中两个矩阵之间的标识行

Identity rows between two matrices in R

假设我们有两个矩阵,即 M1M2,维度分别为 n1 x mn2 x m

我们如何找到 M1 的哪些行与 M2 的行相同(反之亦然)?

最好的输出是一个矩阵,其行数等于矩阵M1M2之间的标识行,并且有两列,即第一列将包含矩阵的行数 M1 和第二个矩阵的行数 M2.

创建具有 4 个匹配行的示例矩阵

set.seed(0)
M1 <- matrix(runif(100), 10)
M2 <- rbind(M1[sample(10, 4),], matrix(runif(60), 6))

创建输出

splits <- lapply(list(M1, M2), function(x) split(x, row(x)))
out <- cbind(M1 = seq(nrow(M1)), M2 = do.call(match, splits))
out[!is.na(out[,2]),]
#      M1 M2
# [1,]  2  4
# [2,]  3  3
# [3,]  6  2
# [4,]  7  1

可能有更巧妙的方法,但这似乎有效...

#dummy data
M1 <- matrix(1:8,ncol=2)
M2 <- matrix(c(1,3,4,5,6,8),ncol=2)

M1
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8

M2
     [,1] [,2]
[1,]    1    5
[2,]    3    6
[3,]    4    8

which(apply(M2, 1, function(v) 
           apply(M1, 1, function(w) sum(abs(w-v))))==0,
      arr.ind = TRUE)

     row col
[1,]   1   1
[2,]   4   3

row列是M1的行索引,col列是M2中匹配行的索引