2015-09-17 15 views
7

私はこの質問に尋ねられていないことに非常に驚いています。私は行列の行をベクトルと比較して、行==どこにでもベクトルを返すかどうかを確認したい。以下の例を参照してください。私はベクトル化された解を求めていますが、行列は遅いループのためには大きすぎるので関数は適用されません。行がたくさんあると仮定して、ベクトルをリッピングすることを避けたいと思います。行列の行がベクトル化されてRでベクトル化されているかどうかを調べる

set.seed(1) 

M = matrix(rpois(50,5),5,10) 

v = c(3 , 2 , 7 , 7 , 4 , 4 , 7 , 4 , 5, 6) 

M 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 4 8 3 5 9 4 5 6 7  7 
[2,] 4 9 3 6 3 1 5 7 6  1 
[3,] 5 6 6 11 6 4 5 2 7  5 
[4,] 8 6 4 4 3 8 3 6 5  6 
[5,] 3 2 7 7 4 4 7 4 5  6 

出力があるべき

FALSE FALSE FALSE FALSE TRUE 

答えて

7

一つの可能​​性である

rowSums(M == v[col(M)]) == ncol(M) 
## [1] FALSE FALSE FALSE FALSE TRUE 

それともsimlarly

rowSums(M == rep(v, each = nrow(M))) == ncol(M) 
## [1] FALSE FALSE FALSE FALSE TRUE 

それとも

colSums(t(M) == v) == ncol(M) 
## [1] FALSE FALSE FALSE FALSE TRUE 

v[col(M)]Mようなベクター同じサイズを作成rep(v, each = nrow(M))だけ短いバージョン(行列は単にベクトルであり、c(M)を試してください)で、次いで==を使用して、その対応する一つに対して各要素とを比較します。幸い==は(ドモルガンのルールを使用してください我々はncol(M)

+0

私はこの単純な論理タスクのもう一つの負担となります作るために、Mは非常に非常に大きな行列であるため、担当者を()使用しないように期待していました。 – robertevansanders

+1

'colSums(t(M)== v)== ncol(M)'が良いですか?それはそうではありません "*単純な論理的な仕事*" btw –

+0

はいそれは素晴らしいです。 – robertevansanders

4

としてマッチの量を持っていますするために、それを私たちはrowSums(またはcolSums)を実行することができますarray方法を(methods("Ops")is.array(M)を参照)がある一般的な機能でありますすべてではないが、一部ではない)、[すべてのいくつかの等しくないない=等しい、我々はまた、

!colSums(t(M) != v) 
0

あなたの問題のために使いやすく、理想的であるrow.matchと呼ばれる機能を有するprodlimパッケージを持っています=。最初にライブラリをインストールしてロードしてください:library(prodlim)。この例ではMの5行目がvに等しいため、row.matchは '5'を返します。これを論理ベクトルに変換することができます。

m <- row.match(v, M) 
m==1:NROW(M)#[1] FALSE FALSE FALSE FALSE TRUE 
関連する問題