studio seleccionar renglon observaciones filas eliminar elemento data columnas columna agregar r dataframe na

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.



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]