Ometti le righe contenenti una colonna specifica di NA


130

Voglio sapere come omettere i NAvalori in un frame di dati, ma solo in alcune colonne che mi interessano.

Per esempio,

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

ma voglio solo di omettere i dati dove yè NA, quindi, il risultato dovrebbe essere

  x  y  z
1 1  0 NA
2 2 10 33

na.omitsembra eliminare tutte le righe ne contengono NA.

Qualcuno può aiutarmi con questa semplice domanda?

Ma se ora cambio la domanda come:

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

Se voglio omettere solo x=nao z=na, dove posso mettere la |funzione?

Risposte:


79

È possibile utilizzare la complete.casesfunzione e inserirla in una funzione in questo modo:

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: restituisce solo righe senza NAs

Se vuoi eliminare tutte le righe con almeno una NAin qualsiasi colonna, usa semplicemente la complete.casesfunzione verso l'alto:

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

O se completeFunè già radicato nel tuo flusso di lavoro;)

completeFun(DF, names(DF))

Puoi rendere avido il tuo approccio? Prendi tutte le colonne che non hanno affatto NA.
Léo Léopold Hertz 준영

1
Vuoi dire solo restituire righe senza NAs? Come completeFun(DF, names(DF))?
BenBarnes,

Corretta! Per favore, considera di aggiungerlo alla tua risposta perché è un bisogno comune qui. - - Penso che la risposta di Mnel non possa essere ampliata come la tua. Il tuo approccio funzionale è fantastico!
Léo Léopold Hertz 준영

1
Fatto! Grazie per la punta @ LéoLéopoldHertz 준영
BenBarnes,

192

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

1
Come si applica avidamente questo approccio su tutte le colonne del set di dati? Se il valore di una colonna è NA, saltare. Quindi l'output del set di dati è solo la seconda colonna.
Léo Léopold Hertz 준영

2
Usa na.omitper rimuovere avidamente tutte le righe con NA in qualsiasi colonnana.omit(DF)
M. Viking

69

Hadley ha tidyrappena ottenuto questa fantastica funzionedrop_na

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

30

Usa 'sottoinsieme'

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

9

È possibile utilizzare na.omitper data.table:

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

3
l' cols=argomento è disponibile nella data.table::na.omitlibreria. Non la base stats::na.omit.
M. Viking,

3

Prova questo:

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

2

Ometti la riga se una delle due colonne specifiche contiene <NA>.

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

1

Prova questo:

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

Traspone il frame di dati e omette le righe null che erano 'colonne' prima della trasposizione e quindi lo trasponi indietro.


9
Per favore, spiega un po 'cosa sta succedendo.
vonbrand,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.