J'ai des problèmes avec une trame de données et je n'ai pas vraiment pu résoudre ce problème moi-même:
la trame de données a des propriétés arbitraires sous forme de colonnes et chaque ligne représente un ensemble de données .
La question est:
comment se débarrasser des colonnes où pour TOUTES les lignes la valeur est NA ?
Les deux approches proposées jusqu'à présent échouent avec de grands ensembles de données car (entre autres problèmes de mémoire) ils créent
is.na(df)
, qui sera un objet de la même taille quedf
.Voici deux approches plus efficaces en termes de mémoire et de temps
Une approche utilisant
Filter
et une approche utilisant data.table (pour le temps général et l'efficacité de la mémoire)
exemples utilisant des données volumineuses (30 colonnes, 1e6 lignes)
la source
data.frame
, cependant. Il n'y a rien ici qui ait vraiment besoindata.table
. La clé est lelapply
, ce qui évite la copie de l'ensemble de l'objet effectuée paris.na(df)
. +10 pour l'avoir signalé.bd1 <- bd[, unlist(lapply(bd, function(x), !all(is.na(x))))]
,
aprèsfunction(x)
- merci pour l'exemple btwdplyr
a maintenant unselect_if
verbe qui peut être utile ici:la source
dplyr
solution. N'a pas été déçu. Merci!Une autre façon serait d'utiliser la
apply()
fonction.Si vous avez le data.frame
Ensuite, vous pouvez utiliser
apply()
pour voir quelles colonnes remplissent votre condition et ainsi vous pouvez simplement faire le même sous-ensemble que dans la réponse de Musa, uniquement avec uneapply
approche.la source
En retard dans le jeu mais vous pouvez également utiliser le
janitor
package. Cette fonction supprimera les colonnes qui sont toutes NA et peut être modifiée pour supprimer les lignes qui sont toutes NA également.df <- janitor::remove_empty(df, which = "cols")
la source
la source
La réponse acceptée ne fonctionne pas avec les colonnes non numériques. À partir de cette réponse , ce qui suit fonctionne avec des colonnes contenant différents types de données
la source
Autres options avec
purrr
package:la source
J'espère que cela peut également aider. Il pourrait être transformé en une seule commande, mais je l'ai trouvé plus facile à lire en le divisant en deux commandes. J'ai créé une fonction avec les instructions suivantes et j'ai travaillé très vite.
naColsRemoval = function (DataTable) { na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )] DataTable [ , unlist (na.cols) := NULL , with = F] }
.SD permettra de limiter la vérification à une partie du tableau, si vous le souhaitez, mais il prendra le tableau entier comme
la source
Une
base R
option pratique pourrait êtrecolMeans()
:la source
Vous pouvez utiliser le package Janitor
remove_empty
Aussi, une autre approche dplyr
OU
ceci est également utile si vous souhaitez uniquement exclure / conserver la colonne avec un certain nombre de valeurs manquantes, par exemple
la source