2012-09-07 34 views
5

ho più colonne integer in un frame di dati, tutti con AN che devo ricodificare a 0.Recode AN in più colonne dataframe

df1 <- as.data.frame(sapply(paste(sample(letters,50,T),sample(letters,10), sep=""), function(x) {sample(c(NA,0:5),10,T)})) 
df2 <- as.data.frame(sapply(paste(sample(letters,5,T),sample(letters,10,T), sep=""), function(x) {sample(letters[1:5],10,T)})) 
df <- cbind(df2,df1) 

producendo un'uscita come questo ... (solo le prime colonne del 55 mostrata)

enter image description here

posso andare circa ricodifica AN a 0 manualmente come df$col[is.na(df$col)] <- 0 per ciascuna colonna, ma dato che ci sono tante colonne, ci vorrebbe un po 'per digitare tale tutti fuori .

Come posso ricodificare tutti questi NA su 0 in una riga o tre?

(mi rendo conto che potrei sciogliere le colonne intere e quindi ricodificare l'una colonna fuso, ma io preferisco fare questo nella base di R)

risposta

11

Eri molto vicino:

df[is.na(df)] <- 0 
+0

Woah .... non si può credere che fosse così facile. Come potrei quindi specificare un intervallo di colonne da ricodificare, anziché tutte? –

+1

Non importa, ho capito. 'df [6:10] [is.na (df [6:10])] <- 0'. Non ho nemmeno pensato di aggiungere due parentesi quadre in una riga. –

+0

@ TommyO'Dell, nessun problema. Come ho detto, eri molto vicino! – A5C1D2H2I1M1N2O1R2T1

2

Utilizzando colwise meta-funzione plyr s' rende questo facile:

dfZ=colwise(function(x)ifelse(is.na(x),0,x))(df) 
+1

sebbene il metodo @ mrdwab sia sicuramente più breve da digitare. –

Problemi correlati