假设我具有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行。
那么如何以有效的方式实现这一目标呢?我已经使用循环编写代码,但是当我使用非常大的矩阵时,这个解决方案需要很长时间。
答案 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
是一个矩阵,包含M1
和M2
之间匹配值的行数。仅当相同的索引在同一行中出现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行。