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 120 cm, mientras que la máxima fue de 204 cm, 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.