Omettre les lignes contenant une colonne spécifique de NA


130

Je veux savoir comment omettre des NAvaleurs dans un bloc 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 veux seulement omettre les données où se ytrouve NA, donc le résultat devrait être

  x  y  z
1 1  0 NA
2 2 10 33

na.omitsemble supprimer toutes les lignes en contiennent NA.

Quelqu'un peut-il m'aider à sortir de cette simple question?

Mais si maintenant je change la question comme:

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 uniquement x=naou z=na, où puis-je mettre la |fonction in?

Réponses:


79

Vous pouvez utiliser la complete.casesfonction et la mettre dans une fonction ainsi:

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: ne renvoie que les lignes sans NAs

Si vous souhaitez éliminer toutes les lignes avec au moins une NAdans n'importe quelle colonne, utilisez simplement la complete.casesfonction directement:

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

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

completeFun(DF, names(DF))

Pouvez-vous rendre votre approche gourmande? Prenez toutes les colonnes qui n'ont pas du tout d'AN.
Léo Léopold Hertz 준영

1
Vous voulez dire simplement retourner les lignes sans NAs? Comme completeFun(DF, names(DF))?
BenBarnes

Correct! S'il vous plaît, pensez à l'ajouter à votre réponse car c'est un besoin courant ici. - - Je pense que la réponse de mnel ne peut pas être étendue comme la vôtre. Votre approche fonctionnelle est excellente!
Léo Léopold Hertz 준영

1
Terminé! Merci pour le tuyau @ LéoLéopoldHertz 준영
BenBarnes

192

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

1
Comment appliquez-vous cette approche avec gourmandise sur toutes les colonnes de l'ensemble de données? Si l'une des valeurs de colonne est NA, sautez. La sortie de votre ensemble de données est donc la deuxième colonne uniquement.
Léo Léopold Hertz 준영

2
Utilisez na.omitpour supprimer goulûment toutes les lignes avec NA dans n'importe quelle colonnena.omit(DF)
M. Viking

69

Hadley tidyrvient d'avoir cette fonction incroyabledrop_na

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

30

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

9

Il est possible de l'utiliser na.omitpour data.table:

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

3
l' cols=argument est disponible dans la data.table::na.omitbibliothèque. Pas la base stats::na.omit.
M. Viking

3

Essaye ça:

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

2

Omettez la ligne si l'une des deux colonnes spécifiques contient <NA>.

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

1

Essayez ceci:

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

Il transpose le bloc de données et omet les lignes nulles qui étaient des «colonnes» avant la transposition, puis vous la transposez à nouveau.


9
Veuillez expliquer un peu ce qui se passe.
vonbrand
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.