¿Cómo eliminar columnas que contienen SOLO NA?

Tengo un data.frame que contiene algunas columnas con todos los valores de NA, ¿cómo puedo eliminarlos de data.frame?

¿Puedo usar la función?

na.omit(...) 

especificando algunos argumentos adicionales?

Una forma de hacerlo:

 df[, colSums(is.na(df)) != nrow(df)] 

Si el conteo de NA en una columna es igual al número de filas, debe ser enteramente NA.

O similarmente

 df[colSums(!is.na(df)) > 0] 

Aquí hay una solución dplyr:

 df %>% select_if(~sum(!is.na(.)) > 0) 

Se ve como si quisiera eliminar SOLAMENTE columnas con TODAS las NA , dejando columnas con algunas filas que sí tienen NA . Yo haría esto (pero estoy seguro de que hay una soution vectorizada eficiente:

 #set seed for reproducibility set.seed <- 103 df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) ) df # id nas vals # 1 1 NA NA # 2 2 NA 2 # 3 3 NA 1 # 4 4 NA 2 # 5 5 NA 2 # 6 6 NA 3 # 7 7 NA 2 # 8 8 NA 3 # 9 9 NA 3 # 10 10 NA 2 #Use this command to remove columns that are entirely NA values, it will elave columns where only some vlaues are NA df[ , ! apply( df , 2 , function(x) all(is.na(x)) ) ] # id vals # 1 1 NA # 2 2 2 # 3 3 1 # 4 4 2 # 5 5 2 # 6 6 3 # 7 7 2 # 8 8 3 # 9 9 3 # 10 10 2 

Si se encuentra en la situación en la que desea eliminar columnas que tienen valores NA , simplemente puede cambiar el comando all a any .

Otra opción es el paquete de janitor :

 df <- remove_empty_cols(df) 

https://github.com/sfirke/janitor

Un script intuitivo: dplyr::select_if(~!all(is.na(.))) . Literalmente mantiene solo columnas que no son todas las que faltan elementos. (para eliminar columnas que no tienen ningún elemento).

 > df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) ) > df %>% glimpse() Observations: 10 Variables: 3 $ id  1, 2, 3, 4, 5, 6, 7, 8, 9, 10 $ nas  NA, NA, NA, NA, NA, NA, NA, NA, NA, NA $ vals  NA, 1, 1, NA, 1, 1, 1, 2, 3, NA > df %>% select_if(~!all(is.na(.))) id vals 1 1 NA 2 2 1 3 3 1 4 4 NA 5 5 1 6 6 1 7 7 1 8 8 2 9 9 3 10 10 NA 

Otra opción con Filter

 Filter(function(x) !all(is.na(x)), df) 

NOTA: Datos de la publicación de @Simon O’Hanlon.