Eliminación de columnas de un dataframe en R en función del porcentaje de NULLS que contengan

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')
Dataset de inicio

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:

Porcentaje de NULLS por columna

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:

Columnas a borrar

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:

Dataframe con las columnas de más de un 20% de NULLS eliminadas

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í:

Dataframe limpio final
Para saber más:
Eliminar columnas de un dataframe que tengan un % de NAs superior a ”x”
Eliminar columnas de un dataframe en R

2 comentarios en “Eliminación de columnas de un dataframe en R en función del porcentaje de NULLS que contengan”

Responder a Jessica Cancelar la respuesta