web-dev-qa-db-fra.com

Trouver des colonnes avec toutes les valeurs manquantes

J'écris une fonction qui nécessite de vérifier si (et quelle!) Colonne (variable) a toutes les valeurs manquantes (NA, <NA>). Ce qui suit est un fragment de la fonction:

test1 <- data.frame (matrix(c(1,2,3,NA,2,3,NA,NA,2), 3,3))
test2 <- data.frame (matrix(c(1,2,3,NA,NA,NA,NA,NA,2), 3,3))

na.test <-  function (data) {
  if (colSums(!is.na(data) == 0)){
      stop ("The some variable in the dataset has all missing value,
     remove the column to proceed")
      }
      }
na.test (test1)

Warning message:
In if (colSums(!is.na(data) == 0)) { :
  the condition has length > 1 and only the first element will be used

Q1: Pourquoi l'erreur ci-dessus et des correctifs?

Q2: Est-il possible de trouver laquelle des colonnes a toutes les NA, par exemple la liste (nom de la variable ou numéro de colonne)?

20
SHRram

C'est assez facile avec avec sapply et une petite fonction anonyme:

sapply(test1, function(x)all(is.na(x)))
   X1    X2    X3 
FALSE FALSE FALSE 

sapply(test2, function(x)all(is.na(x)))
   X1    X2    X3 
FALSE  TRUE FALSE 

Et à l'intérieur d'une fonction:

na.test <-  function (x) {
  w <- sapply(x, function(x)all(is.na(x)))
  if (any(w)) {
    stop(paste("All NA in columns", paste(which(w), collapse=", ")))
  }
}

na.test(test1)

na.test(test2)
Error in na.test(test2) : All NA in columns 2
31
Andrie

En dplyr

ColNums_NotAllMissing <- function(df){ # helper function
  as.vector(which(colSums(is.na(df)) != nrow(df)))
}

df %>%
select(ColNums_NotAllMissing(.))

example:
x <- data.frame(x = c(NA, NA, NA), y = c(1, 2, NA), z = c(5, 6, 7))

x %>%
select(ColNums_NotAllMissing(.))

ou l'inverse

Cols_AllMissing <- function(df){ # helper function
  as.vector(which(colSums(is.na(df)) == nrow(df)))
}


x %>%
  select(-Cols_AllMissing(.))
6
Tony Ladson

Pour trouver les colonnes avec toutes les valeurs manquantes

 allmisscols <- apply(dataset,2, function(x)all(is.na(x)));  
 colswithallmiss <-names(allmisscols[allmisscols>0]);    
 print("the columns with all values missing");    
 print(colswithallmiss);
5
Choukha Ram

Pour vérifier si les colonnes ont toutes les valeurs manquantes:

apply(test1,2,function(x) {all(is.na(x))})

Pour savoir quelles colonnes ont toutes les valeurs manquantes:

  test1.nona <- test1[ , colSums(is.na(test1)) == 0]
2
PHH13

La commande suivante vous donne une table Nice avec les colonnes qui ont des valeurs NA:

sapply(dataframe, function(x)all(any(is.na(x))))

C'est une amélioration pour votre première réponse, qui ne fonctionne pas correctement dans certains cas.

0
cs4r