2013-08-09 14 views
17

Ho cercato di sostituire NaN valori con zeri utilizzando il seguente script:Come sostituire il valore NaN con zero in un enorme frame di dati?

rapply(data123, f=function(x) ifelse(is.nan(x),0,x), how="replace") 
# [31] 0.00000000 -0.67994832 0.50287454 0.63979527 1.48410571 -2.90402836 

Il valore NaN mostrava a zero ma quando ho digitato il nome del frame di dati e cercato di rivedere il valore era ancora rimanente NaN.

data123$contri_us 
# [31]   NaN -0.67994832 0.50287454 0.63979527 1.48410571 -2.90402836 

Non so se il comando è stato effettivamente rapply applicando la regolazione del frame di dati, o semplicemente sostituito il valore secondo mostrato.

Qualche idea su come modificare effettivamente il valore NaN a zero?

+3

Non si può semplicemente fare 'data123 [is.nan (data123)] <- 0 '? –

+0

Ho provato ma R ha restituito il seguente messaggio di errore:> Errore in is.nan (data123): metodo predefinito non implementato per tipo 'elenco' – cactussss

risposta

14

Il seguente dovrebbe fare ciò che si vuole:

x <- data.frame(X1=sample(c(1:3,NaN), 200, replace=TRUE), X2=sample(c(4:6,NaN), 200, replace=TRUE)) 
head(x) 
x <- replace(x, is.na(x), 0) 
head(x) 
56

sembrerebbe che is.nan realtà non ha un metodo per frame di dati, a differenza is.na. Quindi, aggiustiamo quello!

is.nan.data.frame <- function(x) 
do.call(cbind, lapply(x, is.nan)) 

data123[is.nan(data123)] <- 0 
+3

La funzione di fondo dovrebbe essere "is.nan.data.frame". – Dombey

+13

@Dombey Non richiesto; con la magia dell'invio del metodo, "is.nan.data.frame" sarà chiamato automaticamente. –

13

Infatti, in R, questa operazione è molto semplice:

Se la matrice 'a' contiene alcune NaN, basta utilizzare il seguente codice per sostituirlo con 0:

a <- matrix(c(1, NaN, 2, NaN), ncol=2, nrow=2) 
a[is.nan(a)] <- 0 
a 

Se il frame di dati 'b' contiene alcune NaN, è sufficiente utilizzare il seguente codice di sostituirlo con 0:

#for a data.frame: 
b <- data.frame(c1=c(1, NaN, 2), c2=c(NaN, 2, 7)) 
b[is.na(b)] <- 0 
b 

Notare la differenza is.nan quando si tratta di una matrice rispetto a is.na quando si tratta di un frame di dati.

Facendo

#... 
b[is.nan(b)] <- 0 
#... 

rendimenti: Error in is.nan(b) : default method not implemented for type 'list' perché b è un frame di dati.

Nota: A cura per i piccoli, ma confuse errori di battitura

+0

Migliore spiegazione in questa discussione. Grazie – JdM

Problemi correlati