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

时间:2018-06-07 14:10:48

标签: r matrix row identity

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

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

首选输出是一个矩阵,其行数等于矩阵M1M2之间的标识行,两列,即第一列将包含该数字矩阵M1的行,第二行矩阵M2的行数。

2 个答案:

答案 0 :(得分:1)

创建包含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

答案 1 :(得分: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中匹配行的索引。