2012-09-07 14 views
5

tengo varias columnas de números enteros en una trama de datos, todo ello con AN que necesito para volver a codificar a 0.Recode AN en varias columnas trama de datos

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) 

Producir una salida como esta ... (sólo los primeros columnas de la 55 muestra)

enter image description here

puedo ir sobre la recodificación de las AN a 0 manualmente como df$col[is.na(df$col)] <- 0 para cada columna, pero dado que hay tantas columnas, se necesitaría un tiempo para escribir que todo lo alto .

¿Cómo puedo recodificar todas estas NA a 0 en una línea o tres?

(me di cuenta que podía derretir las columnas de tipo entero y luego recodificar la columna derretido, pero yo prefiero hacer esto en la base R)

Respuesta

11

Eras muy cerca:

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

Woah .... no puede creer que fuera tan fácil. ¿Cómo podría entonces especificar un rango de columnas para recodificar, en lugar de todas? –

+1

No importa, lo tengo. 'df [6:10] [is.na (df [6:10])] <- 0'. Ni siquiera pensé agregar dos corchetes en una fila. –

+0

@ TommyO'Dell, no hay problema. Como dije, ¡estabas muy cerca! – A5C1D2H2I1M1N2O1R2T1

2

Uso colwise meta-función plyr 's lo hace fácil:

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

aunque el método de @ mrdwab es ciertamente más corto de escribir. –

Cuestiones relacionadas