Importando en R la Encuesta Nacional de Salud de 2017

Hace unos meses se publicaron los resultados de la Encuesta Nacional de Salud (ENS) de 2017.

Estos datos son abiertos: cualquiera puede descargarlos. Pero… ¿cualquiera puede abrirlos y trabajar con ellos?

La información de la ENS para adultos se proporciona como un fichero de ancho fijo, de la siguiente forma:

Este archivo puede desmotivar a más de uno, ante la incapacidad de llevarse esta información a un entorno de trabajo en el que se encuentre cómodo.

Para importar esta base de datos a R, nos vamos a ayudar del fichero Excel que adjunta la ENS con el diseño de la encuesta, que consta de las variables “VARIABLE INE”, “LONGITUD”, “POSICIÓN INICIO”, “POSICIÓN FINAL”, y “DESCRIPCIÓN DEL CAMPO”.

Con el siguiente código, podemos importar la ENS en R:

# Cargamos los paquetes necesarios
library(openxlsx)
library(dplyr)

# Leemos el Excel en el que se describe el formato de la ENS
campos <- read.xlsx("Adultos_2017/Diseño registro ADULTO ENSE 2017_PUBLICACIÓN.xlsx", colNames = FALSE) %>%
  filter(is.na(X2) == FALSE & X2 != "LONGITUD")

# Extraemos los campos necesarios (nombres de variables, ancho de los campos)
nombres <- campos$X1
anchos  <- campos$X2 %>% as.numeric

# Leemos la base de datos (puede tardar un poco)
tabla <- read.fwf("Adultos_2017/MICRODAT.CA.txt", widths = anchos, col.names = nombres)

# Obtenemos un diccionario de la base de datos
diccionario <- data.frame(variable = campos$X1, descripcion = campos$X5)

En tabla tenemos la base de datos de la ENS, y en diccionario una lista con los nombres de las variables y su descripción:

Ya tenemos la ENS importada en R, y podemos comenzar a analizar los datos, como por ejemplo, un simple descriptivo de la altura, con un gráfico.

# Ejemplo de uso: altura en cm
diccionario %>% filter(variable == "S109")

# Tabla resumen (quitando los no sabe / no contesta)
tabla %>% select(S109) %>% filter(S109 != 998 & S109 != 999) %>% summary()

# Gráfico (quitando los no sabe / no contesta)
tabla %>% select(S109) %>% filter(S109 != 998 & S109 != 999) %>% table %>% plot(xlab = "Altura", ylab = "Frecuencia")

La altura mínima fue de 120cm, mientras que la máxima fue de 204cm, con una media de unos 167 cm.

Agradezco a mi compañera Dafina su interés en este tema, me dio un rompecabezas muy interesante.