2012-11-01 13 views
21

Eventuali duplicati:
Set NA to 0 in RSostituire valori NA da una colonna con 0 nei dati di telaio R

Ho un data.frame con una colonna avente NA valori. Voglio sostituire NA con 0 o qualsiasi altro valore. Ho provato molti thread e metodi ma non mi ha dato il risultato. Ho provato i metodi qui sotto.

a$x[a$x==NA]<-0; 
a[,c("x")]<-apply(a[,c("x")],1,function(z){replace(z, is.na(z), 0)}); 
a$x[is.na(a$x),]<-0; 

Nessuno dei metodi di cui sopra sostituiti con NA 0 nella colonna x per data.frame a. Perché?

+0

Vuoi sostituire 'NA' con' 0' in tutte le colonne, o semplicemente colonna 'x'? – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab: solo colonna x –

risposta

43

Dal momento che nessuno finora si sentiva in forma per indicare perché il quello che stai cercando non funziona:

  1. NA == NA non restituisce TRUE, restituisce NA (poiché il confronto con valori non definiti dovrebbe produrre un risultato non definito).
  2. Stai cercando di chiamare apply su un vettore atomico. Non è possibile utilizzare apply per eseguire il loop sugli elementi di una colonna.
  3. Gli abbonati sono disattivati: stai cercando di assegnare due indici a a$x, che è solo la colonna (un vettore atomico).

mi piacerebbe sistemare 3. per raggiungere a$x[is.na(a$x)] <- 0

8

In primo luogo, ecco alcuni dati di esempio:

set.seed(1) 
dat <- data.frame(one = rnorm(15), 
       two = sample(LETTERS, 15), 
       three = rnorm(15), 
       four = runif(15)) 
dat <- data.frame(lapply(dat, function(x) { x[sample(15, 5)] <- NA; x })) 
head(dat) 
#   one two  three  four 
# 1   NA M 0.80418951 0.8921983 
# 2 0.1836433 O -0.05710677  NA 
# 3 -0.8356286 L 0.50360797 0.3899895 
# 4   NA E   NA  NA 
# 5 0.3295078 S   NA 0.9606180 
# 6 -0.8204684 <NA> -1.28459935 0.4346595 

Ecco la nostra sostituzione:

dat[["four"]][is.na(dat[["four"]])] <- 0 
head(dat) 
#   one two  three  four 
# 1   NA M 0.80418951 0.8921983 
# 2 0.1836433 O -0.05710677 0.0000000 
# 3 -0.8356286 L 0.50360797 0.3899895 
# 4   NA E   NA 0.0000000 
# 5 0.3295078 S   NA 0.9606180 
# 6 -0.8204684 <NA> -1.28459935 0.4346595 

In alternativa, è possibile, naturalmente, scrivere dat$four[is.na(dat$four)] <- 0

+0

questa cosa ha funzionato. Grazie mille. La prego di suggerire se ho fatto male sth nei metodi sopra indicati che ho provato. –

+0

non è la soluzione 'alternativa' migliore solo per la sua semplicità? L'uso di due doppie parentesi offre qualche vantaggio? –

+0

@MikePalmice, certo. La soluzione "alternativa" sarà problematica se stai cercando di affrontare il problema a livello di codice (ad esempio, all'interno di una funzione). – A5C1D2H2I1M1N2O1R2T1

Problemi correlati