¿Cómo identificamos si nuestro data frame incluye valores faltantes?

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

¿Qué hacer con los datos faltantes?

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.