2017-07-17 9 views
2

サイズfactorfactorのi番目とj番目の要素が1の場合は、(i、j)要素が1である×Nのバイナリに変換したいそれ以外は0です。R:因子をバイナリ行列に変換する効率的な方法

以下は私がやりたいことを実装する素朴な方法ですが、このコードはかなり遅いです。同じことをするもっと効率的なやり方はありますか?

size <- 100 
id <- factor(sample(3, size, replace=TRUE)) 
mat <- matrix(0, nrow=size, ncol=size) 

for(i in 1:size){ 
    for(j in 1:size){ 
    if(id[i] == id[j]){ 
     mat[i, j] <- 1 
    } 
    } 
} 
+0

申し訳ありませんが、私は誤ってコピー&ペーストしました。 – myuuuuun

+1

はい...ありがとうございます – myuuuuun

+2

'if(...)の代わりに' mat [i、j] < - (id [i] == id [j])+ 0L'を実行してください。 –

答えて

3

outerを使用できます。

mat <- outer(id, id, "==") 

出力はバイナリ行列であり、O(N^2)オブジェクトは一種の大であるので、これはスパース行列のための良好なユースケースである:

library(Matrix) 
mat <- Matrix(nrow=100, ncol=100) 
mat[] <- outer(id, id, "==") # [] means to assign into the existing 'mat' matrix 
+0

テンソルドを使用するのは面白い方法です。ありがとう! – myuuuuun

+0

良い答えですが、まったく疎な行列を使用しているわけではありません。 – nicola

4

別の代替、これべきあなたはまた、スパース行列

library(Matrix) 
tcrossprod(sparse.model.matrix(~ id + 0)) 
012を使用することができ香港大井の答えに

tcrossprod(model.matrix(~ id + 0)) 

同様に、比較的高速であります

関連する問題