Description

This document describes the steps performed for data reading and transformation of COVID-19 data from México. The data is downloaded from the Mexican government data repository https://datos.gob.mx. The actual data is on a csv file, but contains many categorical variables with numbers. Those numbers represent a category that it is described in another diccionary file. By using the dictionary the original csv file is transformed and each categorical variable is transformed by using the actual values to obtain a more descriptive dataset. The files are provided in the same Website. Additionally, there is another file with that describes each variable and to which catalog corresponds to.

Data reading

The link to México’s COVID-19 related data is the following:

https://datos.gob.mx/busca/dataset/informacion-referente-a-casos-covid-19-en-mexico

After downloading the data from the link, the csv is loaded into R.

covidmx <- read.csv("data_covid19_mexico/200816COVID19MEXICO.csv")

The dataframe has the following structure.

str(covidmx)
## 'data.frame':    1176931 obs. of  35 variables:
##  $ FECHA_ACTUALIZACION: Factor w/ 1 level "2020-08-16": 1 1 1 1 1 1 1 1 1 1 ...
##  $ ID_REGISTRO        : Factor w/ 1176931 levels "000001","000002",..: 1145126 625165 159252 725228 844154 58254 547194 402130 48832 382044 ...
##  $ ORIGEN             : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ SECTOR             : int  3 3 3 3 3 3 4 3 4 3 ...
##  $ ENTIDAD_UM         : int  15 25 27 15 25 15 19 25 9 2 ...
##  $ SEXO               : int  1 1 2 2 1 2 1 1 2 1 ...
##  $ ENTIDAD_NAC        : int  15 25 27 7 25 9 19 25 9 2 ...
##  $ ENTIDAD_RES        : int  15 25 27 15 25 15 19 25 9 2 ...
##  $ MUNICIPIO_RES      : int  76 6 6 81 6 87 10 6 5 2 ...
##  $ TIPO_PACIENTE      : int  1 2 1 2 1 2 1 1 1 1 ...
##  $ FECHA_INGRESO      : Factor w/ 229 levels "2020-01-01","2020-01-02",..: 135 183 157 170 175 148 122 161 123 147 ...
##  $ FECHA_SINTOMAS     : Factor w/ 229 levels "2020-01-01","2020-01-02",..: 132 180 156 156 162 144 120 156 122 144 ...
##  $ FECHA_DEF          : Factor w/ 175 levels "2020-01-13","2020-01-14",..: 175 175 175 175 175 175 175 175 175 175 ...
##  $ INTUBADO           : int  97 2 97 2 97 2 97 97 97 97 ...
##  $ NEUMONIA           : int  2 1 2 1 2 1 2 2 2 2 ...
##  $ EDAD               : int  33 25 51 40 45 33 43 50 52 45 ...
##  $ NACIONALIDAD       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ EMBARAZO           : int  2 2 97 97 2 97 2 2 97 2 ...
##  $ HABLA_LENGUA_INDIG : int  2 2 2 2 2 2 2 2 2 99 ...
##  $ DIABETES           : int  1 2 2 2 2 2 2 2 2 2 ...
##  $ EPOC               : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ ASMA               : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ INMUSUPR           : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ HIPERTENSION       : int  2 2 2 2 2 2 2 1 2 2 ...
##  $ OTRA_COM           : int  2 2 2 2 1 2 2 1 2 2 ...
##  $ CARDIOVASCULAR     : int  2 2 2 2 2 2 2 1 2 2 ...
##  $ OBESIDAD           : int  1 1 2 2 1 2 2 1 2 2 ...
##  $ RENAL_CRONICA      : int  2 2 2 2 2 2 2 2 2 1 ...
##  $ TABAQUISMO         : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ OTRO_CASO          : int  1 99 2 2 1 2 99 1 99 1 ...
##  $ RESULTADO          : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ MIGRANTE           : int  99 99 99 99 99 99 99 99 99 99 ...
##  $ PAIS_NACIONALIDAD  : Factor w/ 114 levels "Alemania","Archipiélago de Svalbard",..: 69 69 69 69 69 69 69 69 69 69 ...
##  $ PAIS_ORIGEN        : Factor w/ 71 levels "99","Alemania",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ UCI                : int  97 2 97 2 97 2 97 97 97 97 ...

The file that describes each variable is loaded, the description and format of each variable is shown in the following table.

library(readxl)
library(kableExtra)
columnInformation <- read_excel("data_covid19_mexico/diccionario_datos_covid19/Descriptores_0419.xlsx",
                                  sheet=1)
kable(columnInformation, format = "html", align = "cllc", 
      caption="Description of each column") %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), 
                full_width = T)
Description of each column
NOMBRE DE VARIABLE DESCRIPCIÓN DE VARIABLE FORMATO O FUENTE
1 FECHA_ACTUALIZACION La base de datos se alimenta diariamente, esta variable permite identificar la fecha de la ultima actualizacion. AAAA-MM-DD
2 ID_REGISTRO Número identificador del caso TEXTO
3 ORIGEN La vigilancia centinela se realiza a través del sistema de unidades de salud monitoras de enfermedades respiratorias (USMER). Las USMER incluyen unidades médicas del primer, segundo o tercer nivel de atención y también participan como USMER las unidades de tercer nivel que por sus características contribuyen a ampliar el panorama de información epidemiológica, entre ellas las que cuenten con especialidad de neumología, infectología o pediatría. (Categorías en Catalógo Anexo). CATÁLOGO: ORIGEN
4 SECTOR Identifica el tipo de institución del Sistema Nacional de Salud que brindó la atención. CATÁLOGO: SECTOR
5 ENTIDAD_UM Identifica la entidad donde se ubica la unidad medica que brindó la atención. CATALÓGO: ENTIDADES
6 SEXO Identifica al sexo del paciente. CATÁLOGO: SEXO
7 ENTIDAD_NAC Identifica la entidad de nacimiento del paciente. CATALÓGO: ENTIDADES
8 ENTIDAD_RES Identifica la entidad de residencia del paciente. CATALÓGO: ENTIDADES
9 MUNICIPIO_RES Identifica el municipio de residencia del paciente. CATALÓGO: MUNICIPIOS
10 TIPO_PACIENTE Identifica el tipo de atención que recibió el paciente en la unidad. Se denomina como ambulatorio si regresó a su casa o se denomina como hospitalizado si fue ingresado a hospitalización. CATÁLOGO: TIPO_PACIENTE
11 FECHA_INGRESO Identifica la fecha de ingreso del paciente a la unidad de atención. AAAA-MM-DD
12 FECHA_SINTOMAS Idenitifica la fecha en que inició la sintomatología del paciente. AAAA-MM-DD
13 FECHA_DEF Identifica la fecha en que el paciente falleció. AAAA-MM-DD
14 INTUBADO Identifica si el paciente requirió de intubación. CATÁLOGO: SI_ NO
15 NEUMONIA Identifica si al paciente se le diagnosticó con neumonía. CATÁLOGO: SI_ NO
16 EDAD Identifica la edad del paciente. NÚMERICA EN AÑOS
17 NACIONALIDAD Identifica si el paciente es mexicano o extranjero. CATÁLOGO: NACIONALIDAD
18 EMBARAZO Identifica si la paciente está embarazada. CATÁLOGO: SI_ NO
19 HABLA_LENGUA_INDIG Identifica si el paciente habla lengua índigena. CATÁLOGO: SI_ NO
20 DIABETES Identifica si el paciente tiene un diagnóstico de diabetes. CATÁLOGO: SI_ NO
21 EPOC Identifica si el paciente tiene un diagnóstico de EPOC. CATÁLOGO: SI_ NO
22 ASMA Identifica si el paciente tiene un diagnóstico de asma. CATÁLOGO: SI_ NO
23 INMUSUPR Identifica si el paciente presenta inmunosupresión. CATÁLOGO: SI_ NO
24 HIPERTENSION Identifica si el paciente tiene un diagnóstico de hipertensión. CATÁLOGO: SI_ NO
25 OTRAS_COM Identifica si el paciente tiene diagnóstico de otras enfermedades. CATÁLOGO: SI_ NO
26 CARDIOVASCULAR Identifica si el paciente tiene un diagnóstico de enfermedades cardiovasculares. CATÁLOGO: SI_ NO
27 OBESIDAD Identifica si el paciente tiene diagnóstico de obesidad. CATÁLOGO: SI_ NO
28 RENAL_CRONICA Identifica si el paciente tiene diagnóstico de insuficiencia renal crónica. CATÁLOGO: SI_ NO
29 TABAQUISMO Identifica si el paciente tiene hábito de tabaquismo. CATÁLOGO: SI_ NO
30 OTRO_CASO Identifica si el paciente tuvo contacto con algún otro caso diagnósticado con SARS CoV-2 CATÁLOGO: SI_ NO
31 RESULTADO Identifica el resultado del análisis de la muestra reportado por el laboratorio de la Red Nacional de Laboratorios de Vigilancia Epidemiológica (INDRE, LESP y LAVE). (Catálogo de resultados diagnósticos anexo). CATÁLOGO: RESULTADO
32 MIGRANTE Identifica si el paciente es una persona migrante. CATÁLOGO: SI_ NO
33 PAIS_NACIONALIDAD Identifica la nacionalidad del paciente. TEXTO, 99= SE IGNORA
34 PAIS_ORIGEN Identifica el país del que partió el paciente rumbo a México. TEXTO, 97= NO APLICA
35 UCI Identifica si el paciente requirió ingresar a una Unidad de Cuidados Intensivos. CATÁLOGO: SI_ NO

On an Excel file on each sheet there is a dictionary for the categorical variables. The file is loaded into a list. Each sheet (or catalog) becomes an element of the list.

dictionaries <- NULL
dict.colnames <- c("ORIGEN", "SECTOR", "SEXO", "TIPO_PACIENTE", "SI_NO", 
                      "NACIONALIDAD", "RESULTADO", "ENTIDADES", "MUNICIPIOS")
i <- 1
for(s in dict.colnames){
  dictionaries[[s]] <- read_excel("data_covid19_mexico/diccionario_datos_covid19/Catalogos_0412.xlsx",
                                  sheet=i)
  i <- i + 1
}

The categorical variables are converted into class factor and the levels and labels are obtained from the dictionaries list.

covidmx$ORIGEN <- factor(covidmx$ORIGEN, 
                         levels=dictionaries[["ORIGEN"]]$CLAVE, 
                         labels=dictionaries[["ORIGEN"]]$DESCRIPCIÓN)
covidmx$SECTOR <- factor(covidmx$SECTOR, 
                         levels=dictionaries[["SECTOR"]]$CLAVE, 
                         labels=dictionaries[["SECTOR"]]$DESCRIPCIÓN)
covidmx$SEXO <- factor(covidmx$SEXO, 
                       levels=dictionaries[["SEXO"]]$CLAVE, 
                       labels=dictionaries[["SEXO"]]$DESCRIPCIÓN)
covidmx$TIPO_PACIENTE <- factor(covidmx$TIPO_PACIENTE, 
                                levels=dictionaries[["TIPO_PACIENTE"]]$CLAVE, 
                                labels=dictionaries[["TIPO_PACIENTE"]]$DESCRIPCIÓN)
covidmx$NACIONALIDAD <- factor(covidmx$NACIONALIDAD, 
                               levels=dictionaries[["NACIONALIDAD"]]$CLAVE, 
                               labels=dictionaries[["NACIONALIDAD"]]$DESCRIPCIÓN)
covidmx$RESULTADO <- factor(covidmx$RESULTADO, 
                            levels=dictionaries[["RESULTADO"]]$CLAVE, 
                            labels=dictionaries[["RESULTADO"]]$DESCRIPCIÓN)

## Labels of dictionari of ENTIDADES and MUNICIPIOS is character, it is transformed to integer
dictionaries[["ENTIDADES"]]$CLAVE_ENTIDAD <- as.integer(dictionaries[["ENTIDADES"]]$CLAVE_ENTIDAD)
dictionaries[["MUNICIPIOS"]]$CLAVE_MUNICIPIO <- as.integer(dictionaries[["MUNICIPIOS"]]$CLAVE_MUNICIPIO)

covidmx$ENTIDAD_NAC <- factor(covidmx$ENTIDAD_NAC, 
                              levels=dictionaries[["ENTIDADES"]]$CLAVE_ENTIDAD, 
                              labels=dictionaries[["ENTIDADES"]]$ENTIDAD_FEDERATIVA)
covidmx$ENTIDAD_RES <- factor(covidmx$ENTIDAD_RES, 
                              levels=dictionaries[["ENTIDADES"]]$CLAVE_ENTIDAD, 
                              labels=dictionaries[["ENTIDADES"]]$ENTIDAD_FEDERATIVA)
covidmx$ENTIDAD_UM <- factor(covidmx$ENTIDAD_UM, 
                             levels=dictionaries[["ENTIDADES"]]$CLAVE_ENTIDAD, 
                             labels=dictionaries[["ENTIDADES"]]$ENTIDAD_FEDERATIVA)
covidmx$MUNICIPIO_RES <- factor(covidmx$MUNICIPIO_RES, 
                                levels=dictionaries[["MUNICIPIOS"]]$CLAVE_MUNICIPIO, 
                                labels=dictionaries[["MUNICIPIOS"]]$MUNICIPIO)
## SI-NO columns
si_no.columnames <- c("INTUBADO", "NEUMONIA", "EMBARAZO", "HABLA_LENGUA_INDIG", 
                      "DIABETES", "EPOC", "ASMA", "INMUSUPR", "HIPERTENSION", 
                      "OTRA_COM", "CARDIOVASCULAR", "OBESIDAD", "RENAL_CRONICA",
                      "TABAQUISMO", "OTRO_CASO", "MIGRANTE", "UCI")

for(s in si_no.columnames){
  covidmx[[s]] <- factor(covidmx[[s]],
                         levels=dictionaries[["SI_NO"]]$CLAVE,
                         labels=dictionaries[["SI_NO"]]$DESCRIPCIÓN)
}

## Clean all temporary variables
rm(i, s, dict.colnames, si_no.columnames, dictionaries)

The structure of the transformed dataframe is the following.

str(covidmx)
## 'data.frame':    1176931 obs. of  35 variables:
##  $ FECHA_ACTUALIZACION: Factor w/ 1 level "2020-08-16": 1 1 1 1 1 1 1 1 1 1 ...
##  $ ID_REGISTRO        : Factor w/ 1176931 levels "000001","000002",..: 1145126 625165 159252 725228 844154 58254 547194 402130 48832 382044 ...
##  $ ORIGEN             : Factor w/ 3 levels "USMER","FUERA DE USMER",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ SECTOR             : Factor w/ 14 levels "CRUZ ROJA","DIF",..: 3 3 3 3 3 3 4 3 4 3 ...
##  $ ENTIDAD_UM         : Factor w/ 36 levels "AGUASCALIENTES",..: 15 25 27 15 25 15 19 25 9 2 ...
##  $ SEXO               : Factor w/ 3 levels "MUJER","HOMBRE",..: 1 1 2 2 1 2 1 1 2 1 ...
##  $ ENTIDAD_NAC        : Factor w/ 36 levels "AGUASCALIENTES",..: 15 25 27 7 25 9 19 25 9 2 ...
##  $ ENTIDAD_RES        : Factor w/ 36 levels "AGUASCALIENTES",..: 15 25 27 15 25 15 19 25 9 2 ...
##  $ MUNICIPIO_RES      : Factor w/ 2326 levels "AGUASCALIENTES",..: 156 6 6 161 6 167 10 6 5 2 ...
##  $ TIPO_PACIENTE      : Factor w/ 3 levels "AMBULATORIO",..: 1 2 1 2 1 2 1 1 1 1 ...
##  $ FECHA_INGRESO      : Factor w/ 229 levels "2020-01-01","2020-01-02",..: 135 183 157 170 175 148 122 161 123 147 ...
##  $ FECHA_SINTOMAS     : Factor w/ 229 levels "2020-01-01","2020-01-02",..: 132 180 156 156 162 144 120 156 122 144 ...
##  $ FECHA_DEF          : Factor w/ 175 levels "2020-01-13","2020-01-14",..: 175 175 175 175 175 175 175 175 175 175 ...
##  $ INTUBADO           : Factor w/ 5 levels "SI","NO","NO APLICA",..: 3 2 3 2 3 2 3 3 3 3 ...
##  $ NEUMONIA           : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 1 2 1 2 1 2 2 2 2 ...
##  $ EDAD               : int  33 25 51 40 45 33 43 50 52 45 ...
##  $ NACIONALIDAD       : Factor w/ 3 levels "MEXICANA","EXTRANJERA",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ EMBARAZO           : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 3 3 2 3 2 2 3 2 ...
##  $ HABLA_LENGUA_INDIG : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 2 2 2 2 2 2 2 5 ...
##  $ DIABETES           : Factor w/ 5 levels "SI","NO","NO APLICA",..: 1 2 2 2 2 2 2 2 2 2 ...
##  $ EPOC               : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ ASMA               : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ INMUSUPR           : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ HIPERTENSION       : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 2 2 2 2 2 1 2 2 ...
##  $ OTRA_COM           : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 2 2 1 2 2 1 2 2 ...
##  $ CARDIOVASCULAR     : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 2 2 2 2 2 1 2 2 ...
##  $ OBESIDAD           : Factor w/ 5 levels "SI","NO","NO APLICA",..: 1 1 2 2 1 2 2 1 2 2 ...
##  $ RENAL_CRONICA      : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 2 2 2 2 2 2 2 1 ...
##  $ TABAQUISMO         : Factor w/ 5 levels "SI","NO","NO APLICA",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ OTRO_CASO          : Factor w/ 5 levels "SI","NO","NO APLICA",..: 1 5 2 2 1 2 5 1 5 1 ...
##  $ RESULTADO          : Factor w/ 3 levels "Positivo SARS-CoV-2",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ MIGRANTE           : Factor w/ 5 levels "SI","NO","NO APLICA",..: 5 5 5 5 5 5 5 5 5 5 ...
##  $ PAIS_NACIONALIDAD  : Factor w/ 114 levels "Alemania","Archipiélago de Svalbard",..: 69 69 69 69 69 69 69 69 69 69 ...
##  $ PAIS_ORIGEN        : Factor w/ 71 levels "99","Alemania",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ UCI                : Factor w/ 5 levels "SI","NO","NO APLICA",..: 3 2 3 2 3 2 3 3 3 3 ...

The dataframe with COVID-19 data is stored in a csv for further analysis.

write.csv(covidmx, file = "data_covid19_mexico/200816COVID19MEXICO_T.csv")