Supprimer les lignes avec tous ou certains NAs (valeurs manquantes) dans les données.cadre
Je voudrais supprimer les lignes dans ce bloc de données qui:
a) contenir NA
s à travers toutes les colonnes. Ci-dessous mon exemple bloc de données.
gene hsap mmul mmus rnor cfam
1 ENSG00000208234 0 NA NA NA NA
2 ENSG00000199674 0 2 2 2 2
3 ENSG00000221622 0 NA NA NA NA
4 ENSG00000207604 0 NA NA 1 2
5 ENSG00000207431 0 NA NA NA NA
6 ENSG00000221312 0 1 2 3 2
En gros, je voudrais faire un bloc de données telles que les suivantes.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) contenir NA
s en seulement quelques colonnes, donc je peux aussi obtenir ce résultat:
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
Vous devez vous connecter pour publier un commentaire.
Également vérifier
complet.cas
:na.omit
est plus juste de retirer tous lesNA
s'.complete.cases
permet la sélection partielle en incluant seulement certaines colonnes de la dataframe:Votre solution ne peut pas travailler. Si vous insistez sur l'utilisation de
is.na
, alors vous devez faire quelque chose comme:mais en utilisant
complete.cases
est beaucoup plus clair et plus rapide.final[complete.cases(final),]
?complete.cases
? Si je voulais garder les lignes avec NAs lieu de les jeter?final[ ! complete.cases(final),]
ne pas coopérer...final[complete.cases(final[ , 5:6]), 5:6]
ou peut-être plus utilementfinal[complete.cases(final[ , 5:6]), c(1,5:6)]
; on peut également sélectionner par nom par exempleselected.names <- c("gene", "rnor", "cfam"); final[complete.cases(final[ , selected.names]), selected.names]
(Probablement pas utile pour vous, pas plus, mais peut-être que pour beaucoup de débutants de la lecture de ce Q)final
est dataframe variable?final[ !complete.cases(final), ]
sur la version 3.5.1 et il fonctionne très bien: garder toutes les lignes qui ont un ou plusieurs NAs.Essayer
na.omit(your.data.frame)
. Quant à la seconde question, essayez de poster une autre question (pour plus de clarté).rownames(x) <- NULL
.na.omit()
gouttes lignes qui contiennentNA
dans n'importe quelle colonnetidyr
a une nouvelle fonctiondrop_na
:drop_na
. Par exemple,df %>% drop_na()
,df %>% na.omit()
etdrop_na(df)
sont essentiellement équivalentes.na.omit
ajoute des informations supplémentaires comme les indices de omis cas, et - plus important encore - est ne vous permet pas de sélectionner les colonnes - c'est là quedrop_na
brille.na.omit
avec ou sans tuyaux, tout comme vous pouvez utiliserdrop_na
avec ou sans tuyaux.Je préfère la façon suivante pour vérifier si les lignes contiennent tout NAs:
Cela renvoie logique de vecteur avec des valeurs indiquant s'il existe une NA dans une rangée. Vous pouvez l'utiliser pour voir comment un grand nombre de lignes que vous aurez à déposer:
et, éventuellement, de les déposer
Pour le filtrage de lignes avec une certaine partie de NAs, il devient un peu plus délicat (par exemple, vous pouvez nourrir à la finale de la[,5:6] " à "appliquer").
Généralement, Joris Meys' solution semble être la plus élégante.
rowSum(!is.na(final))
semble mieux adapté queapply()
Une autre option si vous souhaitez plus de contrôle sur la façon dont les lignes sont tenues pour non valides est
À l'aide de la ci-dessus, ce:
Devient:
...où seule la ligne 5 est supprimée, puisqu'elle est la seule ligne contenant un serveur NAs à deux
rnor
ETcfam
. La logique booléenne peut ensuite être modifiés pour s'adapter à des exigences spécifiques.Si vous souhaitez garder le contrôle sur la façon dont beaucoup de NAs sont valables pour chaque ligne, essayez cette fonction. Pour beaucoup de l'enquête d'ensembles de données, trop de vide question réponses peuvent ruiner les résultats. Donc, ils sont supprimés après un certain seuil. Cette fonction vous permet de choisir combien de sar la ligne peut avoir avant qu'il soit supprimé:
Par défaut, il permettra d'éliminer tous les NAs:
Ou spécifier le nombre maximum de NAs permis:
Si la performance est une priorité, l'utilisation
data.table
etna.omit()
avec l'option paramcols=
.na.omettre.les données.la table
est le plus rapide sur mon indice de référence (voir ci-dessous), que ce soit pour toutes les colonnes ou pour sélectionner les colonnes (OP question de la partie 2).Si vous ne souhaitez pas utiliser
data.table
, utilisezcomplete.cases()
.Sur une vanille
data.frame
,complet.cas
est plus rapide quena.omettre()
oudplyr::drop_na()
. Notez quena.omit.data.frame
ne prend pas en chargecols=
.Résultat de référence
Voici une comparaison de base (bleu),
dplyr
(rose), etdata.table
(jaune) les méthodes de l'abandon de tout ou sélectionnez les observations manquantes, sur les dataset de 1 million d'observations de 20 variables numériques indépendants de 5% la probabilité d'être en manque, et un sous-ensemble de 4 variables pour la partie 2.Vos résultats peuvent varier en fonction de la longueur, la largeur et la densité de votre jeu de données.
Remarque échelle logarithmique sur l'axe des y.
De référence de script
À l'aide de dplyr paquet que l'on peut filtrer NA comme suit:
Revenir les lignes qui ont au moins UN non-NA de valeur.
Revenir les lignes qui ont au moins DEUX non-NA de valeur.
Pour votre première question, j'ai un code que je suis à l'aise avec se débarrasser de tous les NAs. Merci pour @Gregor pour le rendre plus simple.
Pour la deuxième question, le code est juste une alternance à partir de la solution précédente.
Avis de l'-5 est le nombre de colonnes de vos données. Cela permettra d'éliminer les lignes avec toutes les NAs, depuis le rowSums ajoute jusqu'à 5 et ils deviennent des zéros après la soustraction. Cette fois, comme.logique est nécessaire.
Nous pouvons également utiliser la fonction de sous-ensemble pour cela.
Cela donnera uniquement les lignes qui n'ont pas de NA dans les deux mmul et rnor
Je suis un synthétiseur:). Ici, j'ai combiné les réponses en une seule fonction:
En supposant
dat
que votre dataframe, le résultat attendu peut être réalisé en utilisant1.
rowSums
2.
lapply
Au-dessus de la fonction supprime toutes les lignes de la trame de données qui a NA dans la colonne et renvoie les données qui en résultent. Si vous voulez vérifier pour plusieurs valeurs comme
NA
et?
changementdart=c('NA')
en fonction de param pourdart=c('NA', '?')
Ma conjecture est que cela pourrait être plus élégamment résolu de cette façon
NA
. Je pense que ce que l'OP veut, c'est:df %>% filter_all(all_vars(!is.na(.)))
Une approche qui est à la fois général et des rendements assez lisible le code est d'utiliser le
filter
de la fonction et de ses variantes dans le dplyr paquet (filter_all
,filter_at
,filter_if
):