Omitir filas que contienen una columna específica de NA

129

Quiero saber cómo omitir NAvalores en un marco de datos, pero solo en algunas columnas que me interesan.

Por ejemplo,

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

pero solo quiero omitir los datos donde yestá NA, por lo tanto, el resultado debería ser

  x  y  z
1 1  0 NA
2 2 10 33

na.omitParece eliminar todas las filas que contienen alguna NA.

¿Alguien puede ayudarme con esta simple pregunta?

Pero si ahora 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 solo quiero omitir x=nao z=na, ¿dónde puedo poner la |función in?

usuario1489975
fuente

Respuestas:

79

Podría usar la complete.casesfunción y ponerla 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

EDITAR: solo devuelve filas sin NAs

Si desea eliminar todas las filas con al menos una NAen cualquier columna, simplemente use la complete.casesfunción hacia arriba:

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

O si completeFunya está arraigado en su flujo de trabajo;)

completeFun(DF, names(DF))
BenBarnes
fuente
¿Puedes hacer que tu enfoque sea codicioso? Tome todas las columnas que no tienen NA en absoluto.
Léo Léopold Hertz 준영
1
¿Quieres decir simplemente devolver filas sin NAs? Al igual que completeFun(DF, names(DF))?
BenBarnes
¡Correcto! Por favor, considere agregarlo a su respuesta porque es una necesidad común aquí. - - Creo que la respuesta de mnel no se puede ampliar como la tuya. ¡Su enfoque funcional es genial!
Léo Léopold Hertz 준영
1
¡Hecho! Thx por la punta @ LéoLéopoldHertz 준영
Ben Barnes
192

Utilizar 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),]
mnel
fuente
1
¿Cómo aplica este enfoque con avidez en todas las columnas del conjunto de datos? Si alguno de los valores de la columna es NA, omita. Por lo tanto, la salida del conjunto de datos es solo la segunda columna.
Léo Léopold Hertz 준영
2
Úselo na.omitpara eliminar con avidez todas las filas con NA en cualquier columnana.omit(DF)
M. Viking
69

Hadley tidyracaba de obtener esta increíble funcióndrop_na

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33
amrrs
fuente
30

Use 'subconjunto'

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

Se puede usar na.omitpara data.table:

na.omit(data, cols = c("x", "z"))
Droney
fuente
3
El cols=argumento está disponible en la data.table::na.omitbiblioteca. No es la base stats::na.omit.
M. Viking
3

Prueba esto:

cc=is.na(DF$y)
m=which(cc==c("TRUE"))
DF=DF[-m,]
intercambio de rocas
fuente
2

Omita la fila si cualquiera de las dos columnas específicas contiene <NA>.

DF[!is.na(DF$x)&!is.na(DF$z),]
M. vikingo
fuente
1

Solo intenta esto:

DF %>% t %>% na.omit %>% t

Transpone el marco de datos y omite filas nulas que eran 'columnas' antes de la transposición y luego la transpone de nuevo.

Leon Qi
fuente
8
Por favor explique un poco lo que está pasando.
vonbrand