2015-05-19 134 views
5

什麼是用NAs替換矩陣中所有零的最有效方法?將矩陣中的0替換爲NA

我做什麼:

my_matrix[my_matrix==0] <- NA 

我需要它推薦系統(recommenderlab)。填寫新加區與建立推薦系統的時間相同。

EDIT 1:

暗淡(my_matrix)〜500000x500

凡零是〜90%。

+2

我想'my_matrix <[my_matrix!] - NA'要快。 (未測試)。此外,你可以檢查'?替換' – akrun

+1

你的'my_matrix'有多大?我嘗試了'5000 * 5000',使用你的方法和'!my_matrix'的system.tiime是0.470與0.150 – akrun

+1

我想知道你的'replace'解決方案如何工作@akrun。 'replace(my_matrix,my_matrix%in%0,NA)' –

回答

10

答案和標杆

my_matrix <- matrix(1:5e5, ncol=50) 
my_matrix[4000:5000, 3:10] <- 0 

library(microbenchmark) 
microbenchmark(
    insubset  = my_matrix[my_matrix %in% 0], 
    replace1  = replace(my_matrix, my_matrix %in% 0, NA), 
    replace2  = replace(my_matrix, which(my_matrix==0), NA), 
    Aleksandro = my_matrix[my_matrix==0] <- NA, 
    excloperator = my_matrix[!my_matrix] <- NA, 
    is.na  = is.na(my_matrix) <- which(my_matrix == 0) 
) 

Unit: milliseconds 
     expr  min  lq  mean median  uq  max neval 
    insubset 22.579762 22.890431 26.197510 23.453346 25.210976 151.957848 100 
    replace1 21.630386 23.621707 27.573375 25.643425 26.225683 104.389554 100 
    replace2 3.979487 4.069095 4.872796 4.159493 6.449839 8.887427 100 
    Aleksandro 12.787962 13.100210 14.837055 13.689376 14.098338 96.258866 100 
excloperator 11.894246 12.275969 13.541593 13.011391 15.144429 17.307862 100 
     is.na 7.642823 8.901978 15.7352 9.342954 10.13166 68.31235 100 
+1

@akrun,我在~90%0的矩陣上試了一下,結果仍然保持不變:'replace2'仍然是'Aleksandro'和'excloperator'的3倍。任何想法爲什麼'哪個'仍然更快? (這是我使用的矩陣:'ln < - 5e5; my_matrix < - 矩陣(runif(50 * ln),nrow = ln); my_matrix < - replace(my_matrix,which(my_matrix <0.9),NA); ') – adilapapaya

+2

@adilapapaya感謝您的測試。我認爲,通過使用'which'我們得到的位置,而不是有一個巨大的邏輯矩陣 – akrun

+0

'replace2'是最好的。謝謝! –