矩阵的交集

4
我原以为这是一项简单的任务,但令我惊讶的是,我无法找到解决方案。
我需要对矩阵执行集合运算。交集函数在向量上运行良好。但是对于矩阵,它们也将每列视为向量,我需要基于行-行比较而不是矩阵的每个元素来获得结果。
考虑以下两个矩阵:
> m1
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

并且

> m2
     [,1] [,2]
[1,]    1    6
[2,]    3    8
[3,]    4    9
[4,]    5   10
[5,]    6   11

有没有办法取两个矩阵的交集,以便输出只返回第一行?

我认为“交集”不是你期望输出的正确术语。也许应该是“匹配行”?另外,请明确表示m1m2具有相同的维度。 - flodel
3个回答

7

我认为最有效的方法是这样做:

如果您想比较行 i 与行 i(我不会称之为交集):

m1[rowSums(m1 == m2) == ncol(m1), , drop = FALSE]

如果您想比较行i和任何行j(我称之为交集):

m3 <- rbind(m1, m2)
m3[duplicated(m3), , drop = FALSE]

这最后一个假设m1m2是集合,即不同的项目集合。如果不是这种情况,您可以通过将它们通过unique来使它们成为集合:m3 <- rbind(unique(m1), unique(m2))
两者都比使用apply快得多。

谢谢!我采用了类似的方法来查找差异,即E1-E2必须仅返回存在于E1中但不存在于E2中的行。但是重复对此并没有太大帮助。有什么线索吗? - mqpasta

1
使用这个:
m1[apply(m1==m2, 1, all),]

对于成对比较;和这个:
o <- outer(seq_len(nrow(m1)), seq_len(nrow(m2)), Vectorize(
    function(i, j) all(m1[i,]==m2[j,])
))
m1[apply(o, 1, any),]
m2[apply(o, 2, any),]

对于在m1(或m2)中与m2(或m1)中的某一行相等的所有行。


0

看起来你只是想要逐行比较。
在这种情况下,你可以使用

 m1[m1==m2, ]

如果您想跨所有行进行比较,请使用类似以下的内容

 m1[apply(m1, 1, function(r) any(ncol(m2)==rowSums(r==m2))), ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接