Problema
De un data frame deseamos seleccionar aquellas columnas que contengan algún valor NA.
i3 <- c(1, 1, 1, 1, 2, 2)
i2 <- c(NA, 1, 1, 1, 2, 2)
i1 <- c(1, NA, 2, 4, 5, 3)
newdat1 <- data.frame(i3, i2, i1)
newdat1
i3 i2 i1
1 1 NA 1
2 1 1 NA
3 1 1 2
4 1 1 4
5 2 2 5
6 2 2 3
Soluciones
De mayor a menor eficiencia.
newdat1[, sapply(newdat1, anyNA), drop = FALSE]
i2 i1
1 NA 1
2 1 NA
3 1 2
4 1 4
5 2 5
6 2 3
newdat1[,is.na(colSums(newdat1))]
Mi alternativa propuesta. Transponemos el data frame y con complete.cases obtenemos un índice lógico (TRUE, FALSE, FALSE) con las columnas tienen algún NA. Como son aquellas que deseamos con incluir, con el operador ! invertimos el vector lógico anterior (FALSE, TRUE, TRUE) quedándonos con la segunda y tercera columnas.
newdat1[!complete.cases(t(newdat1))]
apply(newdat1, 2, function(x) sum(is.na(x)) == 0 )
Referencias
No hay comentarios:
Publicar un comentario