4

これは簡単な作業だと思っていましたが、驚いたことに、これの解決策を見つけることができません。

行列に対して集合演算を実行する必要があります。ベクトルに対して正常に機能する交差関数。ただし、行列の場合、各列もベクトルと見なされます。行列の各要素ではなく、行 - 行比較の結果が必要です。

次の 2 つの行列を考えてみましょう

> 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

最も効率的なアプローチ(IMHO)は、次のことです。

i行ごとに比較したい場合(私は交差iとは呼びません):

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

i行を任意の行と比較したい場合(私は交差jと呼びます):

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

m1この最後のものは、とがセット、つまり個別のアイテムm2のコレクションであることを前提としています。そうでない場合は、 :を介して渡すことで、それらをセットにすることができます。uniquem3 <- 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. ) 内の他の行と等しい (resp. )内m1のすべての行に対して。m2m2m1

于 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 に答える