web-dev-qa-db-fra.com

Comment supprimer des colonnes contenant UNIQUEMENT des NA?

J'ai un data.frame contenant des colonnes avec toutes les valeurs NA, comment puis-je les supprimer du data.frame.

Puis-je utiliser la fonction

na.omit(...) 

spécifiant des arguments supplémentaires?

66
Lorenzo Rigamonti

Une façon de le faire:

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

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

Ou similaire

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

Voici une solution Dplyr:

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

On dirait que vous voulez supprimer SEULEMENT colonnes avec TOUT NAs, laissant des colonnes avec certaines lignes qui ont NAs. Je le ferais (mais je suis sûr qu’il existe une méthode efficace de vectorisation:

#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 elave columns where only some vlaues 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 des colonnes contenant des valeurs NA, vous pouvez simplement modifier la commande all ci-dessus en any.

22
Simon O'Hanlon

Une autre option est le package janitor:

df <- remove_empty_cols(df)

https://github.com/sfirke/janitor

15
jsta

Un script intuitif: dplyr::select_if(~!all(is.na(.))). Il ne conserve littéralement que les colonnes manquantes de tous les éléments. (pour supprimer toutes les colonnes manquantes).

> df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) )

> df %>% glimpse()
Observations: 10
Variables: 3
$ id   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
$ nas  <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ vals <int> NA, 1, 1, NA, 1, 1, 1, 2, 3, NA

> df %>% select_if(~!all(is.na(.))) 
   id vals
1   1   NA
2   2    1
3   3    1
4   4   NA
5   5    1
6   6    1
7   7    1
8   8    2
9   9    3
10 10   NA
11
Sibo Jiang

Une autre option avec Filter

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

NOTE: Données tirées du message de @Simon O'Hanlon.

8
akrun