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

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

4

3 回答 3

6

最有效的方法(恕我直言)是:

如果你想逐行比较ii我不会称之为交集):

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

于 2013-09-12T17:04:43.430 回答
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),]

对于(resp. ) 中与( m1resp. m2) 中的其他行相等的所有行。m2m1

于 2013-09-12T16:48:36.843 回答
0

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

 m1[m1==m2, ]

如果要比较所有行,请使用类似

 m1[apply(m1, 1, function(r) any(ncol(m2)==rowSums(r==m2))), ]
于 2013-09-12T16:48:55.750 回答