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?

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))

¿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),]

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

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))

9

Se puede usar na.omitpara data.table:

na.omit(data, cols = c("x", "z"))

3
El cols=argumento está disponible en la data.table::na.omitbiblioteca. No es la base stats::na.omit.
M. Viking


2

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

DF[!is.na(DF$x)&!is.na(DF$z),]

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.


8
Por favor explique un poco lo que está pasando.
vonbrand
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.