2015-05-19 5 views
5

Was ist der effizienteste Weg, um alle Nullen in der Matrix durch NAs zu ersetzen?Ersetzen Sie 0 in der Matrix mit NA

Was ich mache:

my_matrix[my_matrix==0] <- NA 

Ich brauche es für Recommender System (recommenderlab). Das Befüllen von NAs dauert genauso lange wie das Erstellen eines Empfehlungssystems.

EDIT 1:

dim (my_matrix) ~ 500000x500

Wo Nullen sind ~ 90%.

+2

Ich würde denken, 'my_matrix <[my_matrix!] - NA' schneller zu sein. (nicht getestet). Außerdem können Sie '? Replace' überprüfen. – akrun

+1

Wie groß ist Ihre' my_matrix'? Ich probierte ein '5000 * 5000' und das system.titime mit Ihrer Methode und die'! My_matrix' war 0.470 vs. 0.150 – akrun

+1

Ich frage mich, wie Ihre 'ersetzen' Lösung @akrun funktionieren würde. 'ersetzen (my_matrix, my_matrix% in% 0, NA)' –

Antwort

10

Antworten und ein Benchmark

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, Ich habe es auf einer Matrix mit ~ 90% 0s probiert und die gleichen Ergebnisse haben immer noch Bestand: 'replace2' ist immer noch ~ 3x so schnell wie' Aleksandro' und 'exoperator'. Irgendeine Idee, warum 'was' noch schneller ist? (Dies ist die Matrix, die ich verwendet habe: 'ln <- 5e5; meine_matrix <- matrix (runif (50 * ln), nrow = ln); meine_matrix <- ersetzen (meine_matrix, die (meine_matrix <0,9), NA); ') – adilapapaya

+2

@adilapapaya Danke für die Prüfung. Ich denke, mit 'which' bekommen wir die Positionen anstatt eine riesige logische Matrix zu haben. – akrun

+0

' replace2' ist die beste. Vielen Dank! –

Verwandte Themen