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