El análisis y limpieza de registros NaNs (aka NULLS) es una tarea común antes de comenzar a trabajar con un conjunto de datos. Eliminar filas que contienen algún hueco es una acción inmediata con la función na.omit(). Pero muchas veces es conveniente realizar un análisis/limpieza de valores NaNs (o NULLS) por columnas en lugar de por filas, para detectar qué variables tienen pocos datos y por tanto no nos aportan información útil en nuestro dataframe.
Cuando el dataframe del que disponemos tiene pocos atributos puede realizarse un análisis manual. Pero cuando el número de columnas es alto, el análisis y limpieza puede volverse tedioso. Veremos en este post un ejemplo sencillo de cómo “detectar” columnas que superen cierto porcentaje de NULLS y cómo eliminarlas de forma automática.
1. Dataset de inicio
Partimos de un dataset ficticio de 29 filas y 7 atributos o columnas, que cargamos desde un archivo rds:
df <- readRDS('datos.rds')
Como se puede observar, hay varios valores NULLS en el dataframe. Realizaremos un análisis por columnas.
2. Análisis y limpieza de NaNs por columnas
En primer lugar, obtenemos el porcentaje de NULLS en cada columna:
colMeans(is.na(df))
El resultado es el siguiente:
Se comprueba que las columnas C3, D4 y G7 tienen un 0% de NULLS, es decir, que no les falta ningún dato. El resto tienen huecos, siendo F6 la que más NULLS tiene con un 44,83% de datos faltantes.
Si realizáramos un na.omit() “a pelo”, tal como se indicó al principio, prácticamente nos quedaríamos sin filas en el dataframe, ya que casi todas las filas contienen NULL en alguna columna. Por ello, vamos a realizar una limpieza de variables (columnas). Para ello, vamos a decidir que nuestro límite tolerable de NULLS es del 20%.
Obtenemos, por tanto, las columnas con un porcentaje de NULLS igual o superior al 20%:
cols_borrar <- which(colMeans(is.na(df)) >= 0.20)
Que nos muestra lo siguiente:
cols_borrar nos indica que la columna 2 (B2) y la columna 6 (F6) contienen más de un 20% de NULLS.
Así, que sin más preámbulos, procedemos a eliminar dichas columnas de forma automática:
df <- df[,-which(colMeans(is.na(df)) >= 0.20)]
El dataframe resultante es el siguiente:
3. Rellenar NULLS con el valor anterior
Por último, y para no dejar huecos de datos en el dataframe, vamos a rellenar estos NaN con el valor anterior de su misma columna. Para ello, utilizaremos la función fill() de la librería Tidyverse:
library(tidyverse) df <- as.data.frame(df %>% fill(colnames(df),.direction = "down"))
Con “down” le indicamos que se debe rellenar de arriba a abajo, de forma que cuando detecte un NULL, se sobrescribirá con su valor anterior. En caso de varios NULLS consecutivos, se rellenaran con el último valor válido.
Finalmente, nuestro dataframe queda así:
Era justo lo que estaba buscando. Me sirvió un montón en el trabajo.
Muchas gracias.
Excelente trabajo, muchas gracias