2012-06-29 32 views
70

que quieren saber cómo omitir NA valores en una trama de datos, pero sólo en algunas columnas Me interesa.filas Omitir contienen columna específica de NA

Por ejemplo,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 

pero sólo quieren omitir los datos donde y es NA, por lo tanto, el resultado debería ser

x y z 
1 1 0 NA 
2 2 10 33 

na.omit parece eliminar todas las filas con cualquier NA.

¿Alguien me puede ayudar con esta simple pregunta?

Pero si ahora me cambio la pregunta como:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA)) 

Si quiero omitir solamente x=na o z=na, donde puedo poner el | de la función?

Respuesta

44

usted podría utilizar la función complete.cases y ponerlo en una función de esta manera:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 

completeFun <- function(data, desiredCols) { 
    completeVec <- complete.cases(data[, desiredCols]) 
    return(data[completeVec, ]) 
} 

completeFun(DF, "y") 
# x y z 
# 1 1 0 NA 
# 2 2 10 33 

completeFun(DF, c("y", "z")) 
# x y z 
# 2 2 10 33 

EDIT:Sólo devolver filas sin NA s

Si desea eliminar todas las filas con al menos un NA en cualquier columna, sólo tiene que utilizar la función complete.cases hacia arriba:

DF[complete.cases(DF), ] 
# x y z 
# 2 2 10 33 

O si completeFun ya está arraigada en el flujo de trabajo;)

completeFun(DF, names(DF)) 
+0

¿Puedes hacer que tu enfoque sea codicioso? Tome todas las columnas que no tengan NA en absoluto. –

+1

¿Quiere decir simplemente devolver * filas * sin 'NA's? Me gusta 'completeFun (DF, names (DF))'? – BenBarnes

+0

¡Correcto! Por favor, considere agregarlo a su respuesta porque aquí es una necesidad común. - - Creo que la respuesta de mnel no se puede expandir como la tuya. ¡Su enfoque de función es genial! –

133

Uso is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 
DF[!is.na(DF$y),] 
+0

¿Cómo se aplica este enfoque con avidez en todas las columnas en el conjunto de datos? Si alguno de los valores de columna es NA omitir. Entonces, su resultado del conjunto de datos es la segunda columna solamente. –

3

Prueba esto:

cc=is.na(DF$y) 
m=which(cc==c("TRUE")) 
DF=DF[-m,] 
20

uso 'subgrupo'

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22)) 
subset(DF, !is.na(y)) 
19

de Hadley tidyr acaba de conseguir esta función increíble drop_na

library(tidyr) 
DF %>% drop_na(y) 
    x y z 
1 1 0 NA 
2 2 10 33 
Cuestiones relacionadas