I'gostaria de remover as linhas neste quadro de dados que:
a) contenha NA
s em todas as colunas. Abaixo está o meu quadro de dados de exemplo.
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
Basicamente, I'gostaria de obter um quadro de dados como o seguinte.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) contenha NA
s apenas em algumas colunas, para que eu também possa obter este resultado:
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
Verifique também 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" é mais agradável por apenas remover todos os "NAs". O `complete.cases' permite a seleção parcial, incluindo apenas certas colunas do quadro de dados:
> 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
A sua solução não pode funcionar. Se você insiste em utilizar o is.na
, então você tem que fazer algo como:
> 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
mas utilizar `complete.cases' é muito mais claro, e mais rápido.
Prefiro a seguinte forma de verificar se as filas contêm alguma AN:
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
Isto retorna um vetor lógico com valores que indicam se existe NA em uma linha. Você pode usá-lo para ver quantas filas você terá que largar:
sum(row.has.na)
e eventualmente deixá-los cair
final.filtered <- final[!row.has.na,]
Para filtrar linhas com certa parte das NAs torna-se um pouco mais complicado (por exemplo, você pode alimentar 'final[,5:6]' para 'aplicar'). Geralmente, a solução de Joris Meys parece ser mais elegante.