Me gustaría eliminar las líneas de este marco de datos que:
a) contienen NA
s en todas las columnas. Abajo está mi marco de datos de ejemplo.
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
Básicamente, me gustaría obtener un marco de datos como el siguiente.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) contiene NA
s sólo en algunas columnas, por lo que también puedo obtener 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
Compruebe también 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 mejor para eliminar todos los NA
. complete.cases
permite una selección parcial al incluir sólo ciertas columnas del marco de datos:
> 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
Tu solución no puede funcionar. 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 usar completar.casos
es bastante más claro, y más rápido.
Prefiero la siguiente forma de comprobar si las filas contienen algún NA:
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
Esto devuelve un vector lógico con valores que denotan si hay algún NA en una fila. Puede utilizarlo para ver cuántas filas tendrá que eliminar:
sum(row.has.na)
y finalmente soltarlas
final.filtered <- final[!row.has.na,]
Para filtrar filas con cierta parte de NAs se vuelve un poco más complicado (por ejemplo, puede alimentar 'final[,5:6]' a 'apply'). En general, la solución de Joris Meys parece más elegante.