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?

user1489975
la source

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))
BenBarnes
la source
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),]
mnel
la source
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
amrrs
la source
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))
Rnoob
la source
9

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

na.omit(data, cols = c("x", "z"))
Droney
la source
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,]
swap
la source
2

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

DF[!is.na(DF$x)&!is.na(DF$z),]
M. Viking
la source
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.

Léon Qi
la source
9
Veuillez expliquer un peu ce qui se passe.
vonbrand