Vorrei rimuovere le linee in questo quadro di dati che:
a) contiene NA
in tutte le colonne. Di seguito il mio esempio di data frame.
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
Fondamentalmente, vorrei ottenere un frame di dati come il seguente.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) contiene NA
s solo in alcune colonne, quindi posso anche ottenere questo risultato:
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
Controlla anche 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
è più carino per rimuovere semplicemente tutti gli NA
's. complete.cases
permette una selezione parziale includendo solo alcune colonne del dataframe:
> 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
La tua soluzione non può funzionare. Se insisti ad usare is.na
, allora devi fare qualcosa come:
> 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
ma usare complete.cases
è molto più chiaro, e più veloce.
Preferisco il seguente modo per controllare se le righe contengono dei NA:
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
Questo restituisce un vettore logico con valori che denotano la presenza o meno di NA in una riga. Potete usarlo per vedere quante righe dovrete eliminare:
sum(row.has.na)
e alla fine eliminarle
final.filtered <- final[!row.has.na,]
Per filtrare le righe con certe parti di NA diventa un po' più complicato (per esempio, si può alimentare 'final[,5:6]' a 'apply'). In generale, la soluzione di Joris Meys sembra essere più elegante.