查找包含另一个矩阵行的矩阵行

时间:2017-01-21 13:05:00

标签: r math matrix operation

假设我具有m×n矩阵M1和k <1矩阵M2,其中l <= n。我想找到M1中包含一些M2行的所有行。

例如,请考虑以下情况:

> M1 <- matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, ncol = 3, byrow = TRUE)
> M2 <- matrix(c(1,3,8,9), nrow = 2, ncol = 2, byrow = TRUE)
> M1
      [,1] [,2] [,3]
 [1,]    1    2    3
 [2,]    4    5    6
 [3,]    7    8    9
> M2
      [,1] [,2]
 [1,]    1    3
 [2,]    8    9

然后M1的第一行和第三行满足条件,第一行包含1和3,最后一行包含第8和第9行。

那么如何以有效的方式实现这一目标呢?我已经使用循环编写代码,但是当我使用非常大的矩阵时,这个解决方案需要很长时间。

2 个答案:

答案 0 :(得分:1)

更一般的例子:

M1 <- matrix(c(1,2,3,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2), nrow = 6, ncol = 3, byrow = TRUE)
M2 <- matrix(c(1,2,6,9, 10,11,16,17, 19, 2), nrow = 5, ncol =2, byrow = TRUE)

首先,使用match查找M1中匹配值的索引。

ind <- match(M1, M2)

现在,使用带有索引和行数的mod运算符%%,您将找到行。这是因为索引总是M2行加上总行数,所以同一行中的数字将返回相同的结果。

rows <- ind %% nrow(M2)

然后,m是一个矩阵,包含M1M2之间匹配值的行数。仅当相同的索引在同一行中出现2次(或更一般地,等于M2中的列数的次数)时,才会选择行。这样可确保只有M1行包含M2中行的所有元素才会被考虑。

m <- matrix(rows, nrow = nrow(M1))
matchRows <- apply(m, 1, duplicated, incomparables = NA)
M1rows <- which(colSums(matchRows)==ncol(M2)-1)

答案 1 :(得分:1)

此方法将检查M2中的每一行,如果包含,则返回M1的行索引;如果不包含,则返回NA

M1 <- matrix(c(1,2,3,4,5,6,7,8,9), nrow = 3, ncol = 3, byrow = TRUE)
> M1
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

M2 <- matrix(c(1,3,8,5,4,5,1,2), nrow = 4, ncol = 2, byrow = TRUE)
> M2
     [,1] [,2]
[1,]    1    3
[2,]    8    5
[3,]    4    5
[4,]    1    2

y = apply(M2,1,function(x){
  z = unique(which(M1 %in% x)%%nrow(M1))
  ifelse(length(z)==1,ifelse(z==0,nrow(M1),z),NA)
})

> y
[1]  1 NA  2  1

这意味着来自M2的行2不在M1中,而来自M2的行1和4在M1中的行1中。 M2中的第3行也在M1的第2行。