109 votes

Comment supprimer les colonnes qui contiennent UNIQUEMENT des NA ?

J'ai un data.frame contenant certaines colonnes avec toutes les valeurs NA. Comment puis-je les supprimer du data.frame ?

Je peux utiliser la fonction,

na.omit(...) 

en spécifiant des arguments supplémentaires ?

152voto

MadScone Points 1927

Une façon de le faire :

df[, colSums(is.na(df)) != nrow(df)]

Si le nombre de NA dans une colonne est égal au nombre de lignes, elle doit être entièrement NA.

Ou encore

df[colSums(!is.na(df)) > 0]

97voto

Brad Cannell Points 874

Voici une solution dplyr :

df %>% select_if(~sum(!is.na(.)) > 0)

Mise à jour : Le site summarise_if() est remplacée par la fonction dplyr 1.0 . Voici deux autres solutions qui utilisent le where() fonction tidyselect :

df %>% 
  select(
    where(
      ~sum(!is.na(.x)) > 0
    )
  )

df %>% 
  select(
    where(
      ~!all(is.na(.x))
    )
  )

41voto

jsta Points 1697

Une autre option est le janitor paquet :

df <- remove_empty_cols(df)

https://github.com/sfirke/janitor

28voto

Simon O'Hanlon Points 27680

Il semble que vous vouliez supprimer UNIQUEMENT colonnes avec TOUTES NA ce qui laisse des colonnes avec quelques lignes qui ont des NA s. Je ferais cela (mais je suis sûr qu'il existe une solution vectorisée efficace) :

#set seed for reproducibility
set.seed <- 103
df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) )
df
#      id nas vals
#   1   1  NA   NA
#   2   2  NA    2
#   3   3  NA    1
#   4   4  NA    2
#   5   5  NA    2
#   6   6  NA    3
#   7   7  NA    2
#   8   8  NA    3
#   9   9  NA    3
#   10 10  NA    2

#Use this command to remove columns that are entirely NA values, it will leave columns where only some values are NA
df[ , ! apply( df , 2 , function(x) all(is.na(x)) ) ]
#      id vals
#   1   1   NA
#   2   2    2
#   3   3    1
#   4   4    2
#   5   5    2
#   6   6    3
#   7   7    2
#   8   8    3
#   9   9    3
#   10 10    2

Si vous vous trouvez dans la situation où vous souhaitez supprimer les colonnes qui ont un quelconque NA vous pouvez simplement modifier les valeurs all ci-dessus pour any .

23voto

akrun Points 148302

Une autre option avec Filter

Filter(function(x) !all(is.na(x)), df)

NOTE : Données issues du post de @Simon O'Hanlon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X