Ir al contenido principal

R: Valores Faltantes en un Data Frame (Missing Values)


Son muy pocas las ocasiones en que las variables de un conjunto de datos están libres de observaciones faltantes (NAs o missing values). Es usual que al abordar una data nos interese saber la cantidad de ausencias, y también su caracterización, es decir, si esa (no respuesta) obedece a un patrón específico o es atribuible a causas aleatorías.
El conteo de valores faltantes por variable, en un data frame, puede realizarse con pocas líneas de código como en el siguiente ejemplo, hecho con una data ficticia y funciones de la familia apply:

# datos ficticios

set.seed(4363)

datos <- replicate(100, sample(c(rchisq(5, runif(1, 1, 100)), NA), 
                               10, replace = TRUE), simplify = FALSE)

datos <- do.call(rbind, datos)

Luego el total de no respuesta por variable sería:

datos <- data.frame(datos)

unlist(lapply(datos, function(x) sum(is.na(x))))

# V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 
# 18  18  18  15  15  19  14  14  15  14
El paquete magritr puede hacer más cómoda la escritura de códigos como este:
library(magrittr)# pipeline

datos %>% 
  lapply(., function(x) sum(is.na(x))) %>% 
  unlist()


# o con la función más estricta vapply

datos %>% 
  vapply(., function(x) sum(is.na(x)), numeric(1))

#  V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 
#  18  18  18  15  15  19  14  14  15  14 
En caso de requerir un gráfico:
n <- length(datos) 

cols <- colorRamps::blue2yellow(n) # seleccionar colores

mp <- datos %>% 
  vapply(., function(x) sum(is.na(x)), numeric(1)) %>% 
  sort() %>% 
  barplot(., axes = FALSE, 
          horiz = TRUE, las = 1, col = rev(cols),
          main = "Valores Faltantes\nEn El Dataset")

height <- vapply(datos, 
                 function(x) sum(is.na(x)), numeric(1)) %>% 
  sort()

text(height, mp, labels = height, 
     col =  ifelse(height >= median(height), "#FFFFFF",
                   "#8B0000"),
     pos = 2, cex = 1.5) # disponer los resultados en las barras


La caracterización involucra más cosas, por supuesto el conocimiento acerca del método en que se generaron los datos puede ser crucial, son usuales tambien análisis descriptivos en los que paquetes cómo car o rpart pueden resultar bastante útiles. Por ejemplo, el paquete Hmisc ofrece la posibilidad de efectuar un rápido cluster de las observaciones faltantes usando Hmisc::naclus(datos), pero en este caso no añadiría informacion alguna, dada la forma en que fueron generados estos datos, lo cual siempre resulta ser bastante relevante.

Comentarios

Entradas populares de este blog

R: Mapas Temáticos (Choropleth)

Frecuentemente surge la necesidad de referenciar data con la ubicación geográfica. Dos insumos indispensables, para este propósito, son los datos de interés y las coordenadas geográficas (longitud, latitud) Con el paquete raster se pueden obtener rapidamente coordenadas geográficas, si el nivel de desagregación que se requiere no es muy detallado; es decir, si las regiones que se van a graficar involucran países o estados. La funcion raster::getData puede proveer data geográfica de cualquier parte, pero sólo en los niveles mencionados. Por ejemplo, si el requerimiento fuera un mapa de suramérica, un modo de proceder sería el siguiente: obtenemos los nombres de los países que componen el subcontinente, la funcion getData requiere codificación ISO3 lo cual puede obtenerse mediante la función raster::ccodes() de la siguiente forma library(sf) library(gapminder) library(ggplot2) library(magrittr) library(raster) raster::ccodes()[ccodes()$continent == 'South America'...

Tableros en R

dashboards

Los tableros de indicadores (una traducción de la palabra dashboards ) han probado ser bastante útiles como medio para presentar un conjunto de cifras, combinando gráficos y tablas. Utilizando los paquetes flexdashboard y shiny , es posible crear un tablero sin que esto demande un despliegue excesivo de líneas de código, y añadiendo elementos interactivos. Un Modo de Hacer Tableros Un archivo flexdashboard , es basicamente un documento rmarkdown , muy usados por su reproducibilidad y porque admiten gran diversidad en el formato de archivos; tienen una estructura básica con una forma como la siguiente: Si se está trabajando en Rstudio , este formato se obtiene seleccionando: Luego se escoge la opción: Para este tablero, añadiré una línea extra ( runtime ) al encabezado de esta página (llamado yaml) justo debajo de vertical_layout: fill , y cambiaré la distribución de columnas a filas; además, dado que usaré la serie BJsales (datos contenidos en R desde su instalación) usar...