Para realizar esta actividad vamos a utilizar el paquete tidyverse():
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.4
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2 v purrr 0.3.4
## v tibble 3.0.4 v dplyr 1.0.2
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
y vamos a crear un data frame ficticio con la función data.frame():
df <- data.frame(x = c(1, 4, 7, 2, NA), y = c(2, 8, NA, 3, 7))
df
## x y
## 1 1 2
## 2 4 8
## 3 7 NA
## 4 2 3
## 5 NA 7
Para comenzar, vamos a utilizar la función is.na() para determinar si el data frame tiene datos faltantes. Esta función devuelve una matríz con dimensiones iguales al data frame con un valor verdadero (TRUE) o falso (FALSE) por cada valor del data frame original: TRUE indica que se trata de un dato faltante y FALSE que no.
is.na(df)
## x y
## [1,] FALSE FALSE
## [2,] FALSE FALSE
## [3,] FALSE TRUE
## [4,] FALSE FALSE
## [5,] TRUE FALSE
Para contabilizar rápidamente la cantidad total de datos faltantes podemos sumar los elementos de la matriz resultante utilizando la función sum(). R interpreta el valor TRUE como 1 y FALSE como 0.
Por ejemplo:
l <- c(TRUE, FALSE, TRUE)
sum(l)
## [1] 2
Podemos ubicar la función is.na() dentro de la función sum() y encontramos que:
sum(is.na(df))
## [1] 2
Para ver cuántos datos faltantes tenemos por columna, una forma sencilla es utilizar la función summary().
summary(df)
## x y
## Min. :1.00 Min. :2.00
## 1st Qu.:1.75 1st Qu.:2.75
## Median :3.00 Median :5.00
## Mean :3.50 Mean :5.00
## 3rd Qu.:4.75 3rd Qu.:7.25
## Max. :7.00 Max. :8.00
## NA's :1 NA's :1
Sin embargo, el resultado obtenido no es práctico si el data frame incluye muchas columnas. En ese caso podemos utilizar la función summarise_all() del paquete dplyr. summarise_all() es una extensión de la función summarise() que permite aplicar una o más funciones a todas las columnas del data frame.
Utilizamos summarise_all() para aplicar la combinación anterior (sum(is.na(.))). El punto dentro de los paréntesis de is.na() refiere la función a las variables seleccionadas, en este caso, todas las del data frame.
df %>%
summarise_all(funs(sum(is.na(.))))
## Warning: `funs()` is deprecated as of dplyr 0.8.0.
## Please use a list of either functions or lambdas:
##
## # Simple named list:
## list(mean = mean, median = median)
##
## # Auto named with `tibble::lst()`:
## tibble::lst(mean, median)
##
## # Using lambdas
## list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
## x y
## 1 1 1
Si el número de columnas es grande, podemos agregar la función t() para transponer o rotar el resultado:
df %>%
summarise_all(funs(sum(is.na(.)))) %>%
t()
## [,1]
## x 1
## y 1
Una vez que identificamos qué columnas contienen datos faltantes y cuántos son, podemos:
La función drop_na() permite eliminar las filas completas de forma sencilla:
df %>%
drop_na()
## x y
## 1 1 2
## 2 4 8
## 3 2 3
En este caso, de las cinco filas que tiene el data frame original sólo quedan 3.
La función replace_na() permite reemplazar los valores faltantes por un valor específico por columna.
df %>%
replace_na(list(x = 2, y = 7))
## x y
## 1 1 2
## 2 4 8
## 3 7 7
## 4 2 3
## 5 2 7
También permite asignar valores utilizando una función. En este ejemplo, reemplazamos los datos faltantes con el valor promedio de cada columna:
df %>%
replace_na(as.list(colMeans(.,na.rm = TRUE)))
## x y
## 1 1.0 2
## 2 4.0 8
## 3 7.0 5
## 4 2.0 3
## 5 3.5 7
Actualmente, hay casos donde pueden utilizarse métodos de imputación múltiple. Un paquete útil para aplicar estos métodos es mice. Pueden obtener más información al respecto en:
https://datascienceplus.com/imputing-missing-data-with-r-mice-package/
O en el artículo:
Buuren, S. V., & Groothuis-Oudshoorn, K. (2010). mice: Multivariate imputation by chained equations in R. Journal of statistical software, 1-68.