Cómo reemplazar valores faltantes (NA) en R: na.omit y na.rm

Los valores faltantes en la ciencia de datos surgen cuando falta una observación en una columna de un marco de datos o contiene un valor de carácter en lugar de un valor numérico. Los valores faltantes deben eliminarse o reemplazarse para poder sacar conclusiones correctas de los datos.

En este tutorial, aprenderemos cómo lidiar con valores faltantes con la biblioteca dplyr. La biblioteca dplyr es parte de un ecosistema para realizar un análisis de datos.

Reemplazar valores faltantes en R

En este tutorial, aprenderá

mudar()

El cuarto verbo en el biblioteca dplyr Es útil para crear una nueva variable o cambiar los valores de una variable existente.

Procederemos en dos partes. Aprenderemos a:

  • excluir valores faltantes de un marco de datos
  • imputar los valores faltantes con la media y la mediana

El verbo mutate() es muy fácil de usar. Podemos crear una nueva variable siguiendo esta sintaxis:

mutate(df, name_variable_1 = condition, ...)
arguments:
-df: Data frame used to create a new variable
-name_variable_1: Name and the formula to create the new variable
-...: No limit constraint. Possibility to create more than one variable inside mutate()

Excluir valores faltantes (NA)

El método na.omit() de la biblioteca dplyr es una forma sencilla de excluir las observaciones faltantes. Eliminar todos los NA de los datos es fácil, pero no significa que sea la solución más elegante. Durante el análisis, es recomendable utilizar una variedad de métodos para lidiar con los valores faltantes.

Para abordar el problema de las observaciones faltantes, utilizaremos el conjunto de datos del Titanic. En este conjunto de datos, tenemos acceso a la información de los pasajeros a bordo durante la tragedia. Este conjunto de datos tiene muchas NA que deben tenerse en cuenta.

Subiremos el archivo csv desde Internet y luego verificaremos qué columnas tienen NA. Para obtener las columnas con datos faltantes, podemos usar el siguiente código:

Carguemos los datos y verifiquemos los datos que faltan.

PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv"
df_titanic <- read.csv(PATH, sep = ",")
# Return the column names containing missing observations
list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]
list_na

Salida:

## [1] "age"  "fare"

Aquí,

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

Da el nombre de las columnas que no tienen datos.

A las columnas edad y tarifa les faltan valores.

Podemos eliminarlos con na.omit().

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

Salida:

## [1] 1045   13

El nuevo conjunto de datos contiene 1045 filas en comparación con las 1309 del conjunto de datos original.

Excluir valores faltantes

Imputar datos faltantes con la media y la mediana

También podríamos imputar (rellenar) los valores faltantes con la mediana o la media. Una buena práctica es crear dos variables separadas para la media y la mediana. Una vez creado, podemos reemplazar los valores faltantes con las variables recién formadas.

Usaremos el método de aplicación para calcular la media de la columna con NA. Veamos un ejemplo

Paso 1) Anteriormente en el tutorial, almacenamos el nombre de las columnas con los valores faltantes en la lista llamada list_na. Usaremos esta lista

Paso 2) Ahora necesitamos calcular la media con el argumento na.rm = VERDADERO. Este argumento es obligatorio porque a las columnas les faltan datos y esto le dice a R que los ignore.

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

Explicación del código:

Pasamos 4 argumentos en el método de aplicación.

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. Este código devolverá el nombre de las columnas del objeto list_na (es decir, "edad" y "tarifa")
  • 2: Calcular la función en las columnas.
  • media: Calcular la media
  • na.rm = VERDADERO: ignorar los valores faltantes

Salida:

##      age     fare 
## 29.88113 33.29548

Creamos con éxito la media de las columnas que contienen observaciones faltantes. Estos dos valores se utilizarán para reemplazar las observaciones faltantes.

Paso 3) Reemplazar los valores de NA

El verbo mutar de la biblioteca dplyr es útil para crear una nueva variable. No necesariamente queremos cambiar la columna original para poder crear una nueva variable sin NA. mutate es fácil de usar, simplemente elegimos un nombre de variable y definimos cómo crear esta variable. Aquí está el código completo.

# Create a new variable with the mean and median
df_titanic_replace <- df_titanic %>%
   mutate(replace_mean_age  = ifelse(is.na(age), average_missing[1], age),
   replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))

Explicación del código:

Creamos dos variables, replace_mean_age y replace_mean_fare de la siguiente manera:

  • reemplazar_edad_media = ifelse(is.na(edad), falta_promedio[1], edad)
  • reemplazar_tarifa_media = ifelse(is.na(tarifa), promedio_faltante[2],tarifa)

Si a la columna edad le faltan valores, reemplácela con el primer elemento de Average_missing (media de edad); de lo contrario, mantenga los valores originales. Misma lógica para la tarifa.

sum(is.na(df_titanic_replace$age))

Salida:

## [1] 263

Realiza el reemplazo

sum(is.na(df_titanic_replace$replace_mean_age))

Salida:

## [1] 0

La edad de la columna original tiene 263 valores faltantes, mientras que la variable recién creada los reemplazó con la media de la variable edad.

Paso 4) También podemos reemplazar las observaciones faltantes con la mediana.

median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      median,
      na.rm =  TRUE)
df_titanic_replace <- df_titanic %>%
            mutate(replace_median_age  = ifelse(is.na(age), median_missing[1], age), 
            replace_median_fare = ifelse(is.na(fare), median_missing[2], fare))
head(df_titanic_replace)

Salida:

Imputar datos faltantes con la media y la mediana

Paso 5) Un gran conjunto de datos podría tener muchos valores faltantes y el método anterior podría resultar engorroso. Podemos ejecutar todos los pasos anteriores en una línea de código usando el método sapply(). Aunque no conoceríamos los valores de la media y la mediana.

sapply no crea un marco de datos, por lo que podemos envolver la función sapply() dentro de data.frame() para crear un objeto de marco de datos.

# Quick code to replace missing values with the mean
df_titanic_impute_mean < -data.frame(
    sapply(
        df_titanic,
        function(x) ifelse(is.na(x),
            mean(x, na.rm = TRUE),
            x)))

Resumen

Tenemos tres métodos para lidiar con los valores faltantes:

  • Excluir todas las observaciones faltantes.
  • Imputar con la media
  • Imputar con la mediana

La siguiente tabla resume cómo eliminar todas las observaciones faltantes

Biblioteca Objetivo Código
bases Listar observaciones faltantes
colnames(df)[apply(df, 2, anyNA)]
dplyr Eliminar todos los valores faltantes
na.omit(df)

La imputación de media o mediana se puede realizar de dos formas.

  • Usando aplicar
  • usando sapply
Método Detalles Ventajas Desventajas
Paso a paso con aplicar Verifique las columnas que faltan, calcule la media/mediana, almacene el valor, reemplace con mutate() Conoces el valor de la media/mediana Más tiempo de ejecución. Puede ser lento con un gran conjunto de datos
Manera rápida con sapply Utilice sapply() y data.frame() para buscar y reemplazar automáticamente los valores faltantes con media/mediana Código corto y rápido. No conozco los valores de imputación.

Boletín diario de Guru99

Empieza el día con las últimas y más importantes noticias sobre IA, entregadas ahora mismo.