V tem podatkovnem okviru bi rad odstranil vrstice, ki:
** Spodaj je moj primer podatkovnega okvira.
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
V bistvu bi rad dobil podatkovni okvir, kot je naslednji.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) vsebuje NA
le v nekaterih stolpcih, tako da lahko dobim tudi ta rezultat:
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
Preverite tudi 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
je lepši za preprosto odstranjevanje vseh NA
's. complete.cases
omogoča delno izbiro z vključitvijo le nekaterih stolpcev podatkovnega okvira:
> 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
Vaša rešitev ne more delovati. Če vztrajate pri uporabi is.na
, potem morate narediti nekaj takega:
> 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
vendar je uporaba complete.cases
precej bolj jasna in hitrejša.
Za preverjanje, ali vrstice vsebujejo NA, mi je ljubši naslednji način:
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
Ta vrne logični vektor z vrednostmi, ki označujejo, ali je v vrstici kakšen NA. Z njim lahko preverite, koliko vrstic boste morali opustiti:
sum(row.has.na)
in jih na koncu opustiti
final.filtered <- final[!row.has.na,]
Za filtriranje vrstic z določenim delom NA je to nekoliko bolj zapleteno (na primer, lahko 'final[,5:6]' podate 'apply'). Na splošno se zdi rešitev Jorisa Meysa bolj elegantna.