Question Supprimer des lignes avec tout ou partie NA (valeurs manquantes) dans data.frame


Je voudrais supprimer les lignes dans ce cadre de données qui ...

une) contenir NAs sur 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) contenir NAs 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

651
2018-02-01 11:52


origine


Réponses:


Vérifiez également complete.cases :

> final[complete.cases(final), ]
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
6 ENSG00000221312    0    1    2    3    2

na.omit est plus agréable pour simplement enlever tout NA's. complete.cases permet une sélection partielle en n'incluant que certaines colonnes de l'image:

> final[complete.cases(final[ , 5:6]),]
             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

Votre solution ne peut pas fonctionner. Si vous insistez pour utiliser is.na, alors vous devez faire quelque chose comme:

> final[rowSums(is.na(final[ , 5:6])) == 0, ]
             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

mais en utilisant complete.cases est beaucoup plus clair et plus rapide.


830
2018-02-01 12:21



Essayer na.omit(your.data.frame). En ce qui concerne la deuxième question, essayez de l'afficher comme une autre question (pour plus de clarté).


200
2018-02-01 12:00



Je préfère suivre la façon de vérifier si les lignes contiennent des NA:

row.has.na <- apply(final, 1, function(x){any(is.na(x))})

Cela renvoie un vecteur logique avec des valeurs indiquant s'il y a une NA dans une ligne. Vous pouvez l'utiliser pour voir combien de lignes vous devrez laisser tomber:

sum(row.has.na)

et finalement les laisser tomber

final.filtered <- final[!row.has.na,]

Pour filtrer des lignes avec certaines parties de NA, cela devient un peu plus compliqué (par exemple, vous pouvez utiliser 'final [, 5: 6]' pour 'appliquer'). Généralement, la solution de Joris Meys semble être plus élégante.


78
2018-02-02 21:58



Si vous aimez les pipes (%>%), tidyrde nouveau drop_na est votre ami:

library(tidyr)
df %>% drop_na()
#              gene hsap mmul mmus rnor cfam
# 2 ENSG00000199674    0    2    2    2    2
# 6 ENSG00000221312    0    1    2    3    2
df %>% drop_na(rnor, cfam)
#              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

52
2017-08-16 08:49



Une autre option si vous voulez un meilleur contrôle sur la façon dont les lignes sont jugées invalides est

final <- final[!(is.na(final$rnor)) | !(is.na(rawdata$cfam)),]

En utilisant ce qui précède, ceci:

             gene hsap mmul mmus rnor cfam
1 ENSG00000208234    0   NA   NA   NA   2
2 ENSG00000199674    0   2    2    2    2
3 ENSG00000221622    0   NA   NA   2   NA
4 ENSG00000207604    0   NA   NA   1    2
5 ENSG00000207431    0   NA   NA   NA   NA
6 ENSG00000221312    0   1    2    3    2

Devient:

             gene hsap mmul mmus rnor cfam
1 ENSG00000208234    0   NA   NA   NA   2
2 ENSG00000199674    0   2    2    2    2
3 ENSG00000221622    0   NA   NA   2   NA
4 ENSG00000207604    0   NA   NA   1    2
6 ENSG00000221312    0   1    2    3    2

... où seule la ligne 5 est supprimée car c'est la seule ligne contenant des NA pour les deux rnor ET cfam. La logique booléenne peut ensuite être modifiée pour s'adapter à des exigences spécifiques.


36
2017-11-05 06:30



Si vous souhaitez contrôler le nombre de NA valides pour chaque ligne, essayez cette fonction. Pour de nombreux ensembles de données d'enquête, trop de réponses aux questions vides peuvent ruiner les résultats. Donc, ils sont supprimés après un certain seuil. Cette fonction vous permettra de choisir combien d'AN la rangée peut avoir avant de la supprimer:

delete.na <- function(DF, n=0) {
  DF[rowSums(is.na(DF)) <= n,]
}

Par défaut, il éliminera toutes les NA:

delete.na(final)
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
6 ENSG00000221312    0    1    2    3    2

Ou spécifiez le nombre maximum d'AN autorisées:

delete.na(final, 2)
             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

29
2018-05-26 14:49



Cela retournera les lignes qui ont au moins UNE valeur non-NA.

final[rowSums(is.na(final))<length(final),]

Cela retournera les lignes qui ont au moins DEUX valeurs non NA.

final[rowSums(is.na(final))<(length(final)-1),]

14
2017-09-19 12:36