Je voudrais supprimer les lignes de ce bloc de données qui:
a) contient NA
s dans toutes les colonnes. Voici mon exemple de trame 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
Fondamentalement, j'aimerais obtenir une trame de données comme celle-ci.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) contient NA
s dans 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
final[complete.cases(final),]
?complete.cases
? Si je voulais conserver les lignes avec des NA au lieu de les supprimer?final[ ! complete.cases(final),]
ne coopère pas ...final
la variable dataframe est-elle variable?Essayez
na.omit(your.data.frame)
. Quant à la deuxième question, essayez de la poster comme une autre question (pour plus de clarté).la source
rownames(x) <- NULL
.na.omit()
supprime les lignes qui contiennentNA
dans n'importe quelle colonnetidyr
a une nouvelle fonctiondrop_na
:la source
drop_na
. Par exemple,df %>% drop_na()
,df %>% na.omit()
etdrop_na(df)
sont tous essentiellement équivalents.na.omit
ajoute des informations supplémentaires comme les indices des cas omis, et - plus important encore - ne vous permet pas de sélectionner des 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 suivre la façon de vérifier si les lignes contiennent des NA:
Cela renvoie un vecteur logique avec des valeurs indiquant s'il y a une NA dans une rangée. Vous pouvez l'utiliser pour voir combien de lignes vous devrez supprimer:
et finalement les laisser tomber
Pour filtrer les lignes avec certaines parties des AN, cela devient un peu plus compliqué (par exemple, vous pouvez insérer «final [, 5: 6]» pour «appliquer»). D'une manière générale, la solution de Joris Meys semble plus élégante.
la source
rowSum(!is.na(final))
semble mieux adapté queapply()
Une autre option si vous souhaitez un meilleur contrôle sur la façon dont les lignes sont considérées comme non valides est
En utilisant ce qui précède, ceci:
Devient:
... où seule la ligne 5 est supprimée car c'est la seule ligne contenant des NA pour les deux
rnor
ETcfam
. La logique booléenne peut ensuite être modifiée pour répondre à des exigences spécifiques.la source
Si vous souhaitez contrôler le nombre d'AN valides pour chaque ligne, essayez cette fonction. Pour de nombreux ensembles de données d'enquête, trop de réponses aux questions vierges peuvent ruiner les résultats. Ils sont donc supprimés après un certain seuil. Cette fonction vous permettra de choisir le nombre d'AN que la ligne peut avoir avant d'être supprimée:
Par défaut, il éliminera toutes les NA:
Ou spécifiez le nombre maximum d'AN autorisées:
la source
Si les performances sont une priorité, utilisez
data.table
etna.omit()
avec param facultatifcols=
.na.omit.data.table
est le plus rapide de mon benchmark (voir ci-dessous), que ce soit pour toutes les colonnes ou pour certaines colonnes (OP question 2).Si vous ne voulez pas utiliser
data.table
, utilisezcomplete.cases()
.Sur une vanille
data.frame
,complete.cases
est plus rapide quena.omit()
oudplyr::drop_na()
. Notez quena.omit.data.frame
cela ne prend pas en chargecols=
.Résultat de référence
Voici une comparaison des méthodes de base (bleu),
dplyr
(rose) etdata.table
(jaune) pour supprimer toutes ou sélectionner les observations manquantes, sur un ensemble de données théorique de 1 million d'observations de 20 variables numériques avec une probabilité indépendante de 5% d'être manquant, et un sous-ensemble de 4 variables pour la partie 2.Vos résultats peuvent varier en fonction de la longueur, de la largeur et de la rareté de votre ensemble de données particulier.
Notez l'échelle logarithmique sur l'axe y.
Script de référence
la source
En utilisant le package dplyr, nous pouvons filtrer NA comme suit:
la source
drop_na()
Cela retournera les lignes qui ont au moins UNE valeur non NA.
Cela retournera les lignes qui ont au moins DEUX valeurs non NA.
la source
Pour votre première question, j'ai un code avec lequel je suis à l'aise pour me débarrasser de toutes les AN. Merci pour @Gregor pour le simplifier.
Pour la deuxième question, le code est juste une alternance de la solution précédente.
Notez que -5 est le nombre de colonnes dans vos données. Cela éliminera les lignes avec toutes les NA, puisque les rowSums totalisent 5 et ils deviennent des zéros après soustraction. Cette fois, car.logical est nécessaire.
la source
Nous pouvons également utiliser la fonction de sous-ensemble pour cela.
Cela ne donnera que les lignes qui n'ont pas de NA à la fois mmul et rnor
la source
Je suis synthétiseur :). Ici, j'ai combiné les réponses en une seule fonction:
la source
En supposant
dat
que votre trame de données, la sortie attendue peut être obtenue en utilisant1.
rowSums
2.
lapply
la source
Une approche qui est à la fois générale et donne un code assez lisible est d'utiliser la
filter
fonction et ses variantes dans le paquet dplyr (filter_all
,filter_at
,filter_if
):la source
La fonction ci-dessus supprime toutes les lignes du bloc de données qui a «NA» dans n'importe quelle colonne et renvoie les données résultantes. Si vous voulez vérifier plusieurs valeurs comme
NA
et?
changer ledart=c('NA')
paramètre de fonction endart=c('NA', '?')
la source
Je suppose que cela pourrait être résolu de manière plus élégante de cette manière:
la source
NA
. Je pense que ce que le PO veut, c'est:df %>% filter_all(all_vars(!is.na(.)))