Jag vill ta bort de rader i denna dataruta som:
a) Innehåller NA
s 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 NA
s 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
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.
Jag föredrar följande sätt att kontrollera om raderna innehåller några NAs:
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
Detta returnerar en logisk vektor med värden som anger om det finns någon NA i en rad. Du kan använda den för att se hur många rader du måste ta bort:
sum(row.has.na)
och så småningom släppa dem
final.filtered <- final[!row.has.na,]
För filtrering av rader med vissa delar av NAs blir det lite knepigare (du kan till exempel mata 'final[,5:6]' till 'apply'). Generellt sett verkar Joris Meys' lösning vara mer elegant.