web-dev-qa-db-fra.com

Rechercher les noms des colonnes contenant des valeurs manquantes

Je veux trouver tous les noms des colonnes avec NA ou des données manquantes et stocker ces noms de colonnes dans un vecteur.

# create matrix
a <- c(1,2,3,4,5,NA,7,8,9,10,NA,12,13,14,NA,16,17,18,19,20)
cnames <- c("aa", "bb", "cc", "dd", "ee")
mymatrix <- matrix(a, nrow = 4, ncol = 5, byrow = TRUE)
colnames(mymatrix) <- cnames
mymatrix
#      aa bb cc dd ee
# [1,]  1  2  3  4  5
# [2,] NA  7  8  9 10
# [3,] NA 12 13 14 NA
# [4,] 16 17 18 19 20

Le résultat souhaité: colonnes "aa" Et "ee".

Ma tentative:

bad <- character()
for (j in 1:4){     
  tmp <- which(colnames(mymatrix[j, ]) %in% c("", "NA"))
  bad <- tmp
}

Cependant, je continue à obtenir integer(0) comme sortie. Toute aide est appréciée.

29
lever

Comme ça?

colnames(mymatrix)[colSums(is.na(mymatrix)) > 0]
# [1] "aa" "ee"
59
Henrik

R 3.1 a introduit une fonction anyNA, qui est plus pratique et plus rapide:

colnames(mymatrix)[ apply(mymatrix, 2, anyNA) ]

Ancienne réponse:

S'il s'agit d'une matrice très longue, apply + any peut court-circuiter et fonctionner un peu plus rapidement.

apply(is.na(mymatrix), 2, any)
#   aa    bb    cc    dd    ee 
# TRUE FALSE FALSE FALSE  TRUE 
colnames(mymatrix)[apply(is.na(mymatrix), 2, any)]
# [1] "aa" "ee"
18
Neal Fultz

Si vous avez un bloc de données avec des colonnes non numériques, cette solution est plus générale (en s'appuyant sur les réponses précédentes):

R 3.1 +

names(which(sapply(mymatrix, anyNA)))

ou

names(which(sapply(mymatrix, function(x) any(is.na(x)))))

4
verbamour