168 votes

Omettre les lignes contenant une colonne spécifique de NA

Je voudrais savoir comment omettre NA dans un cadre de données, mais seulement dans certaines colonnes qui m'intéressent.

Par exemple,

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

mais je ne veux omettre que les données où y es NA Le résultat devrait donc être

  x  y  z
1 1  0 NA
2 2 10 33

na.omit semble supprimer toutes les lignes contenant des NA .

Quelqu'un peut-il m'aider à répondre à cette simple question ?

Mais si maintenant je modifie la question comme suit :

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

Si je veux omettre seulement x=na o z=na où puis-je mettre le | en fonction ?

240voto

mnel Points 48160

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

103voto

amrrs Points 3824

Hadley's tidyr vient de recevoir cette fonction étonnante drop_na

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

94voto

BenBarnes Points 8928

Vous pouvez utiliser le complete.cases et l'insérer dans une fonction de la manière suivante :

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: Ne renvoie que les lignes qui n'ont pas de NA s

Si vous souhaitez éliminer toutes les lignes comportant au moins un NA dans n'importe quelle colonne, il suffit d'utiliser l'option complete.cases de manière directe :

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

Ou si completeFun est déjà ancré dans votre flux de travail ;)

completeFun(DF, names(DF))

36voto

Rnoob Points 35

Utiliser "sous-ensemble

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

17voto

Droney Points 179

Il est possible d'utiliser na.omit para data.table :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X