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?
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]
Voici une solution Dplyr:
df %>% select_if(~sum(!is.na(.)) > 0)
On dirait que vous voulez supprimer SEULEMENT colonnes avec TOUT NA
s, laissant des colonnes avec certaines lignes qui ont NA
s. 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
.
Une autre option est le package janitor
:
df <- remove_empty_cols(df)
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
Une autre option avec Filter
Filter(function(x) !all(is.na(x)), df)
NOTE: Données tirées du message de @Simon O'Hanlon.