Je voudrais supprimer les lignes de ce cadre de données qui.. :
a) contenant des NA
s sur toutes les colonnes. Voici mon exemple de cadre 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, j’aimerais obtenir un cadre de données tel que le suivant.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) contenant des NA
s dans certaines colonnes seulement, 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
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 pratique pour supprimer simplement tous les NA
. complete.cases
permet une sélection partielle en incluant seulement certaines colonnes du cadre de données :
> 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 utiliser complete.cases
est beaucoup plus clair, et plus rapide.
Je préfère la méthode suivante pour vérifier si les lignes contiennent des NA :
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
Cette méthode renvoie un vecteur logique avec des valeurs indiquant s'il y a des NA dans une ligne. Vous pouvez l'utiliser pour savoir combien de lignes vous devez supprimer :
sum(row.has.na)
et éventuellement les supprimer
final.filtered <- final[!row.has.na,]
Pour filtrer les lignes contenant certaines parties de NA, cela devient un peu plus délicat (par exemple, vous pouvez introduire 'final[,5:6]' dans 'apply'). En général, la solution de Joris Meys semble être plus élégante.