Tengo problemas con un marco de datos y realmente no puedo resolver ese problema yo mismo:
el marco de datos tiene propiedades arbitrarias como columnas y cada fila representa un conjunto de datos .
La pregunta es:
¿Cómo deshacerse de las columnas donde para TODAS las filas el valor es NA ?
Los dos enfoques ofrecidos hasta ahora fallan con los grandes conjuntos de datos que (entre otros problemas de memoria) crean
is.na(df)
, que será un objeto del mismo tamaño quedf
.Aquí hay dos enfoques que son más eficientes en cuanto a memoria y tiempo
Un enfoque usando
Filter
y un enfoque usando data.table (para tiempo general y eficiencia de memoria)
ejemplos que usan datos grandes (30 columnas, 1e6 filas)
fuente
data.frame
. Aquí no hay nada que realmente necesitedata.table
. La clave es ellapply
, que evita la copia de todo el objeto realizado poris.na(df)
. +10 por señalar eso.bd1 <- bd[, unlist(lapply(bd, function(x), !all(is.na(x))))]
,
afterfunction(x)
- gracias por el ejemplo por ciertodplyr
ahora tiene unselect_if
verbo que puede ser útil aquí:fuente
dplyr
solución. No me decepcionó. ¡Gracias!Otra forma sería usar la
apply()
función.Si tienes el data.frame
entonces puede usar
apply()
para ver qué columnas cumplen con su condición y así puede simplemente hacer el mismo subconjunto que en la respuesta de Musa, solo con unapply
enfoque.fuente
Tarde al juego, pero también puedes usar el
janitor
paquete. Esta función eliminará las columnas que son todas NA y también se puede cambiar para eliminar las filas que son todas NA.df <- janitor::remove_empty(df, which = "cols")
fuente
fuente
La respuesta aceptada no funciona con columnas no numéricas. De esta respuesta , lo siguiente funciona con columnas que contienen diferentes tipos de datos
fuente
Otras opciones con
purrr
paquete:fuente
Espero que esto también pueda ayudar. Podría convertirse en un solo comando, pero me resultó más fácil de leer al dividirlo en dos comandos. Hice una función con las siguientes instrucciones y trabajé a la velocidad del rayo.
naColsRemoval = function (DataTable) { na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )] DataTable [ , unlist (na.cols) := NULL , with = F] }
.SD permitirá limitar la verificación a parte de la tabla, si lo desea, pero tomará toda la tabla como
fuente
Una
base R
opción útil podría sercolMeans()
:fuente
Puedes usar el paquete de conserje
remove_empty
Además, otro enfoque dplyr
O
Esto también es útil si desea excluir / mantener solo la columna con cierto número de valores faltantes, por ejemplo
fuente