web-dev-qa-db-fra.com

Omettre les lignes contenant une colonne spécifique de NA

Je veux savoir comment omettre les valeurs NA d'un bloc de données, mais uniquement 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ù y est NA, donc le résultat devrait être

  x  y  z
1 1  0 NA
2 2 10 33

na.omit semble supprimer toutes les lignes contenant n'importe quel NA.

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

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=na ou z=na, où puis-je placer le | dans la fonction?

104
user1489975

Vous pouvez utiliser la fonction complete.cases et la placer comme suit:

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: Renvoie uniquement les lignes sans NAs

Si vous voulez éliminer toutes les lignes avec au moins une NA dans une colonne, utilisez simplement la fonction complete.cases:

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

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

completeFun(DF, names(DF))
67
BenBarnes

Utilisez 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),]
165
mnel

Hadley's tidyr vient d'obtenir cette fonction étonnante drop_na

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

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

A présent, il est possible d'utiliser simplement:

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

Essaye ça:

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

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

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

Essayez ceci:

DF %>% t %>% na.omit %>% t
0
Leon Qi