Искам да премахна редовете в тази рамка от данни, които:
По-долу е примерната ми рамка от данни: а) съдържа 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
е доста по-ясно, а и по-бързо.
Опитайте с na.omit(your.data.frame)
. Що се отнася до втория въпрос, опитайте се да го публикувате като друг въпрос (за по-голяма яснота).
Предпочитам следния начин за проверка дали редовете съдържат NA:
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
Връща се логически вектор със стойности, обозначаващи дали в даден ред има NA. Можете да го използвате, за да видите колко реда ще трябва да изхвърлите:
sum(row.has.na)
и евентуално да ги изхвърлите
final.filtered <- final[!row.has.na,]
За филтриране на редове с определена част от NA става малко по-трудно (например можете да подадете 'final[,5:6]' към 'apply'). Като цяло решението на Joris Meys' изглежда по-елегантно.