renglon - seleccionar columnas en r
¿Cómo eliminar columnas que contienen SOLO NA? (6)
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?
Aquí hay una solución dplyr:
df %>% select_if(~sum(!is.na(.)) > 0)
Otra opción con Filter
Filter(function(x) !all(is.na(x)), df)
NOTA: Datos de la publicación de @Simon O''Hanlon.
Otra opción es el paquete de janitor
:
df <- remove_empty_cols(df)
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
.
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 <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
$ nas <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ vals <int> 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
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]