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

Mapas Fáciles con Leaflet

A través de mapas es posible visualizar el comportamiento de una variable en un determinado espacio. Con Leaflet, en R, pueden obtenerse mapas con facilidad y rapidez. Para instalar este paquete, simplemente se hace uso del comando install.packages . Luego se activa con la orden library . Al escribir los siguientes comandos, se obtiene una representación global de los 5 continentes. library(leaflet) library(leaflet.extra) # heatmaps library(magrittr) # para haceer uso del pipeline '%>%' leaflet() %>% addTiles() Las funciones setView(), fitBounds, flyTo() sirven para enfocar áreas de interés específico. Por ejemplo: leaflet() %>% addTiles() %>% setView(lng = -66.9, lat = 10.5, zoom = 11) Es preciso introducir latitud, longitud y zoom, este último para controlar el acercamiento. Es posible hacer mapas de áreas más específicas, si se cuenta con mediciones. Los mapas que aparecen seguidamente, a modo de ilustración, fueron obtenidos a partir de ...