298 votos

eliminar filas con NAs en data.frame

Me gustaría eliminar las líneas en este dataframe que contienen NAs en todas las columnas. A continuación es mi ejemplo 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

y, básicamente, me gustaría conseguir un DF tales como :

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

También, me gustaría saber cómo filtrar sólo para algunas de las columnas, para que yo también pueda obtener un DF como este:

             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

394voto

Joris Meys Puntos 38980

También compruebe 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 es más sólo la eliminación de todas las NA. complete.cases permite la selección parcial mediante el uso de parte de la 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

Su solución no puede trabajar. Si usted insiste en usar is.na, entonces usted tiene que hacer 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

pero el uso de complete.cases es bastante más claro, y más rápido.

100voto

Roman Luštrik Puntos 19295

Intente na.omit(your.data.frame). En cuanto a la segunda pregunta, tratar de publicar como una pregunta (para mayor claridad).

46voto

donshikin Puntos 476

Yo prefiero la siguiente manera para comprobar si las filas contienen algún NAs:

row.has.na <- apply(final, 1, function(x){any(is.na(x))})

Esto devuelve lógico vector con los valores que denotan si es que existe NA en una fila. Se puede utilizar para ver cuántas filas tendrás que soltar:

sum(row.has.na)

y, finalmente, caer

final.filtered <- final[!row.has.na,]

Para el filtrado de filas con cierta parte de NAs se vuelve un poco más complicado (por ejemplo, se puede alimentar el final[,5:6]' a 'aplicar'). En general, Joris Meys' parece ser la más elegante.

18voto

getting-there Puntos 417

Otra opción si desea mayor control sobre cómo filas se considerará no válida

final <- final[!(is.na(final$rnor)) | !(is.na(rawdata$cfam)),]

Con la anterior, esta:

             gene hsap mmul mmus rnor cfam
1 ENSG00000208234    0   NA   NA   NA   2
2 ENSG00000199674    0   2    2    2    2
3 ENSG00000221622    0   NA   NA   2   NA
4 ENSG00000207604    0   NA   NA   1    2
5 ENSG00000207431    0   NA   NA   NA   NA
6 ENSG00000221312    0   1    2    3    2

Se convierte en:

             gene hsap mmul mmus rnor cfam
1 ENSG00000208234    0   NA   NA   NA   2
2 ENSG00000199674    0   2    2    2    2
3 ENSG00000221622    0   NA   NA   2   NA
4 ENSG00000207604    0   NA   NA   1    2
6 ENSG00000221312    0   1    2    3    2

...donde sólo la fila 5 se elimina, ya que es la única fila que contiene NAs para ambos rnor Y cfam. La lógica booleana luego puede ser cambiado para adaptarse a los requisitos específicos.

0voto

Benoit B. Puntos 1184

Bueno, he encontrado esto (mi DF si se llama final)

> t = final[!(is.na(final[,2:6]) ),]
> head(t)
             gene hsap mmul mmus rnor cfam
1 ENSG00000208234    0   NA   NA   NA   NA
2 ENSG00000199674    0   NA   NA   NA   NA
3 ENSG00000221622    0   NA   NA   NA   NA
4 ENSG00000207604    0   NA   NA   NA   NA
5 ENSG00000207431    0   NA   NA   NA   NA
6 ENSG00000221312    0   NA   NA   NA   NA
> dim(t)
[1] 104696      6
> dim(final)
[1] 221147      6

cuando se mira en el DF t head(t) parece que el NAs todavía están allí, sin embargo mirando el tamaño de la DF con dim(t) algunos de filtrado parece haber sido hecho. Esto me parece extraño.

Ben

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X