Ta bort rader med alla eller vissa NAs (saknade värden) i data.frame

Jag vill ta bort de rader i denna dataruta som:

a) Innehåller NAs i alla kolumner. Nedan är min exempeldataruta.

             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

I princip skulle jag vilja få en dataruta som följande.

             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0   2    2    2    2
6 ENSG00000221312    0   1    2    3    2

b) Innehåller NAs i endast vissa kolumner, så att jag också kan få detta resultat:

             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
Lösning

Kontrollera också [complete.cases] (http://stat.ethz.ch/R-manual/R-patched/library/stats/html/complete.cases.html) :

> 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 är bättre för att bara ta bort alla NA's. complete.cases tillåter partiellt urval genom att endast inkludera vissa kolumner i dataframen:

> 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

Din lösning kan inte fungera. Om du insisterar på att använda is.na måste du göra något liknande:

> 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

men att använda complete.cases är mycket tydligare och snabbare.

Kommentarer (10)

Försök med na.omit(your.data.frame). När det gäller den andra frågan kan du försöka ställa den som en annan fråga (för tydlighetens skull).

Kommentarer (3)

Jag föredrar följande sätt att kontrollera om raderna innehåller några NAs:


row.has.na 
Kommentarer (2)