2017-01-21 12 views
1

私はm×nの行列M1とk×lの行列M2をl< = nとします。私はそれにM2のいくつかの行を含むM1のすべての行を見つけるしたい。行1は、どのように1と3と最後の行8および9他の行列の行を含む行列の行を見つける

が含まれているとして、次に行1とM1の3は、条件を満たし

> 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 

:たとえば

は、次のような状況を考えますこれを効率的な方法で達成するには?私はループを使ってコードを書いていますが、非常に大きな行列で作業するので、この解決には多くの時間がかかります。

+0

テーブル(行(M1)、係数(M1,1:9))とテーブル(行(M2)、係数(M2、1:9) ) 'である。そうすれば、行間の関係をより簡単に見つけることができます。スパースな選択肢に落ちるので、それ以来、メモリの問題、 'ライブラリ(行列); tab1 = sparseMatrix(i =行(M1)、j = M1、x = 1L)。 tab2 = sparseMatrix(i =行(M2)、j = M2、x = 1L)。 tcrossprod(tab1、tab2) 'です。最後のオブジェクトは、「M1」と「M2」の各行間の同時発生をカウントし、結果を抽出するために「nrow(M2)」と比較することができます。 –

+0

@StefanH以下の回答のいずれかがあなたの問題を解決した場合は、それを合格とマークすることを検討してください。 –

答えて

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) 

まず、M1に一致する値のインデックスを見つけるためにmatchを使用します。

ind <- match(M1, M2) 

さて、インデックスと行数とMOD演算子%%を使用して、あなたは行を見つけることができます。これは、インデックスが常にM2行に行の合計数を加えたものになるため、同じ行の数値が同じ結果を返すためです。

rows <- ind %% nrow(M2) 

そして、mM1M2間の値に一致する行番号を含む行列です。同じインデックスが同じ行に2回表示される場合(または、より一般的には、列数がM2に等しい場合のみ)、行が選択されます。これにより、行のすべての要素がM2に含まれている場合にのみ、M1の行が考慮されることが保証されます。

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

3行目は私にとって魔法のように思えますが、なぜこれが機能しているのかわかりません。一般的なケースでも機能していますか? – StefanH

+0

@StefanH投稿を更新し、より一般的な例を追加し、コードを説明しました。私はそれがより明確であることを望む。 –

+0

さて、わかりました。ありがとう、しかし私はその特定の問題を意味しません。あなたの解決策は、M2のすべての行がM1の行のどこかに含まれている場合にのみ機能します。しかし、そうである必要はありません。結果が間違っているM2 < - matrix(c(1,4,8,910,11,16,17)、nrow = 4、ncol = 2、byrow = TRUE)を考えてみましょう。M1の行に含まれているかどうかを知りたい番号としてM2の行をイメージ化します.1つの番号がM1の行に1つだけ存在することは完全に有効ですが、これらの場合はカウントしたくありません。 – StefanH

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の行1とM2はM1の行1にあります。また、M2の行3はM1の第2行にある。

+0

あなたの答えをありがとうが、これは動作していないいくつかのM2の行が複数回発生した場合、例えばM1 = matrix(c(1,2,3,1,2,3,4,5,6,7,8 、9)、nrow = 4、ncol = 3、byrow = TRUE)。 – StefanH

関連する問題