2017-07-17 81 views
2

如果factor的第i和第j個元素是(i,j)元素爲1,則我想將尺寸n factor轉換爲×n二元組matrix相同,否則爲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

這是使用tensordot的有趣方式。謝謝! – myuuuuun

+0

好的答案,但你沒有任何方式利用稀疏矩陣。 – nicola

4

另一種替代方法,其中應可以比較快

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

同樣以香港大井的回答,您還可以使用稀疏矩陣

library(Matrix) 
tcrossprod(sparse.model.matrix(~ id + 0)) 
相關問題