Cómo reemplazar valores perdidos (NA) en R: na.omit & na.rm

Tabla de contenido:

Anonim

Los valores perdidos 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 extraer una conclusión correcta de los datos.

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

En este tutorial, aprenderá

  • mudar()
  • Excluir valores perdidos (NA)
  • Imputar valores perdidos (NA) con la media y la mediana

mudar()

El cuarto verbo de la biblioteca dplyr es útil para crear una nueva variable o cambiar los valores de una variable existente.

Procederemos en dos partes. Aprenderemos a:

  • excluir los valores perdidos de un marco de datos
  • imputar los valores perdidos 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 perdidos (NA)

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

Para abordar el problema de las observaciones faltantes, utilizaremos el conjunto de datos titánico. 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 de las que se debe ocupar.

Cargaremos el archivo csv de Internet y luego comprobaremos qué columnas tienen NA. Para devolver 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 observationslist_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]list_na

Producción:

## [1] "age" "fare"

Aquí,

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

Da el nombre de las columnas que no tienen datos.

Las columnas edad y tarifa tienen valores perdidos.

Podemos soltarlos con na.omit ().

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

Producción:

## [1] 1045 13

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

Imputar los datos faltantes con la media y la mediana

También podríamos imputar (completar) los valores perdidos 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 = TRUE. Este argumento es obligatorio porque a las columnas les faltan datos, y esto le dice a R que los ignore.

# Create meanaverage_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)% en% list_na]. Este código devolverá el nombre de las columnas del objeto list_na (es decir, "edad" y "tarifa")
  • 2: Calcule la función en las columnas
  • mean: Calcule la media
  • na.rm = TRUE: Ignora los valores faltantes

Producción:

## 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 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 el NA. mutate es fácil de usar, solo 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 mediandf_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:

  • replace_mean_age = ifelse (is.na (age), average_missing [1], age)
  • replace_mean_fare = ifelse (is.na (tarifa), average_missing [2], tarifa)

Si la edad de la columna tiene valores perdidos, reemplácelos con el primer elemento de average_missing (edad media); de lo contrario, mantenga los valores originales. Misma lógica para la tarifa

sum(is.na(df_titanic_replace$age))

Producción:

## [1] 263

Realizar el reemplazo

sum(is.na(df_titanic_replace$replace_mean_age))

Producción:

## [1] 0 

La edad de la columna original tiene 263 valores perdidos, mientras que la variable recién creada los ha reemplazado 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)

Producción:

Paso 5) Un gran conjunto de datos podría tener muchos valores perdidos y el método anterior podría ser 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 media y 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 meandf_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 perdidos:

  • Excluir todas las observaciones que faltan
  • Imputar con la media
  • Imputar con la mediana

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

Biblioteca Objetivo Código
base Enumere las observaciones que faltan
colnames(df)[apply(df, 2, anyNA)]
dplyr Eliminar todos los valores faltantes
na.omit(df)

La imputación con 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 las medias / 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