2012-06-14 36 views
76

Tengo un marco de datos con algunas columnas numéricas. Algunas filas tienen un valor 0 que debe considerarse nulo en el análisis estadístico. ¿Cuál es la forma más rápida de reemplazar todo el valor 0 por NULL en R?Reemplazar todos los 0 valores a NA

+11

No creo que usted quiere/puede reemplazar con valores NULL, pero NA cumple ese propósito en R lingo. – Chase

Respuesta

141

Sustitución de 0 a NA:

df[df == 0] <- NA 
+3

¿Cuál sería la sintaxis equivalente para un objeto data.table? – dadrivr

+2

Veo que ha obtenido muchos votos, pero no creo que esto cubra adecuadamente los casos extremos de columnas no numéricas con valores de "0" que no se solicitaron para establecerse en . –

14
#Sample data 
set.seed(1) 
dat <- data.frame(x = sample(0:2, 5, TRUE), y = sample(0:2, 5, TRUE)) 
#----- 
    x y 
1 0 2 
2 1 2 
3 1 1 
4 2 1 
5 0 0 

#replace zeros with NA 
dat[dat==0] <- NA 
#----- 
    x y 
1 NA 2 
2 1 2 
3 1 1 
4 2 1 
5 NA NA 
19

Una forma alternativa sin la función [<-:

una trama de datos de muestra dat (descaradamente copiado de @ respuesta de Chase):

dat 

    x y 
1 0 2 
2 1 2 
3 1 1 
4 2 1 
5 0 0 

Zeroes se pueden reemplazar por NA por la función is.na<-:

is.na(dat) <- !dat 


dat 

    x y 
1 NA 2 
2 1 2 
3 1 1 
4 2 1 
5 NA NA 
3

Puede reemplazar 0 con NA sólo en los campos numéricos (es decir, sin incluir cosas como factores), pero funciona sobre una base de la columna por columna:

col[col == 0 & is.numeric(col)] <- NA 

Con una función, se puede aplicar esto a su trama de datos entera:

changetoNA <- function(colnum,df) { 
    col <- df[,colnum] 
    if (is.numeric(col)) { #edit: verifying column is numeric 
     col[col == -1 & is.numeric(col)] <- NA 
    } 
    return(col) 
} 
df <- data.frame(sapply(1:5, changetoNA, df)) 

Aunque se puede reemplazar 1:5 con el número de columnas en su marco de datos, o con 1:ncol(df).

+0

No estoy seguro de que esta sea la solución correcta. ¿Qué pasa con las columnas 6 y más? Serán cortados. – userJT

+0

Es por eso que sugerí reemplazar '1: 5' con' 1: ncol (df) 'al final. No quería que la ecuación fuera demasiado compleja o difícil de leer. –

+0

pero, ¿qué pasa si en las columnas 6 y 7? El tipo de datos es char y no debe hacerse ningún reemplazo. En mi problema, necesito reemplazo solo en las columnas 12 a 15, pero el df completo tiene 21 columnas (muchas no deben tocarse en absoluto). – userJT

20

Déjeme asumir que su data.frame es una mezcla de diferentes tipos de datos y no es necesario modificar todas las columnas.

modificar sólo las columnas 12 a 18 (de un total de 21), acaba de hacer esta

df[, 12:18][df[, 12:18] == 0] <- NA 
10

Debido a que alguien le preguntó por la versión Data.Table de esto, y debido a que la dada hoja.de.datos solución no hace trabajo con data.table, estoy proporcionando la solución a continuación.

Básicamente, utilice el operador := ->DT[x == 0, x := NA]

library("data.table") 

status = as.data.table(occupationalStatus) 

head(status, 10) 
    origin destination N 
1:  1   1 50 
2:  2   1 16 
3:  3   1 12 
4:  4   1 11 
5:  5   1 2 
6:  6   1 12 
7:  7   1 0 
8:  8   1 0 
9:  1   2 19 
10:  2   2 40 


status[N == 0, N := NA] 

head(status, 10) 
    origin destination N 
1:  1   1 50 
2:  2   1 16 
3:  3   1 12 
4:  4   1 11 
5:  5   1 2 
6:  6   1 12 
7:  7   1 NA 
8:  8   1 NA 
9:  1   2 19 
10:  2   2 40 
+1

O 'para (j en nombres (DT)); set (DT, que (DT [[j]] == 0), j, NA) '. Consulte [aquí] (http://stackoverflow.com/a/7249454/4241780) para obtener una explicación más detallada sobre el uso de data.table para buscar y reemplazar valores. – JWilliman

0

intento por debajo

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

+0

Esto está al revés: la pregunta es cómo reemplazar 0 con NA, no NA con 0. – Gregor

Cuestiones relacionadas