Премахване на редове с всички или някои NA (липсващи стойности) в data.frame

Искам да премахна редовете в тази рамка от данни, които:

По-долу е примерната ми рамка от данни: а) съдържа NA във всички колони.

             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

В общи линии бих искал да получа рамка от данни, подобна на следната.

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

б) съдържа NA само в някои колони, за да мога да получа и този резултат:

             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
Решение

Проверете също 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 е по-хубав за просто премахване на всички NA's. complete.cases позволява частична селекция чрез включване само на определени колони от рамката с данни:

> 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

Вашето решение не може да работи. Ако държите да използвате is.na, тогава трябва да направите нещо подобно:

> 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

но използването на complete.cases е доста по-ясно, а и по-бързо.

Коментари (10)

Опитайте с na.omit(your.data.frame). Що се отнася до втория въпрос, опитайте се да го публикувате като друг въпрос (за по-голяма яснота).

Коментари (3)

Предпочитам следния начин за проверка дали редовете съдържат NA:


row.has.na 
Коментари (2)