Construcción de archivo CSV en R (archivo para Red7 Create)

 Lenguaje R - Red7 Create.

Uno de los puntos débiles y de falta de interés por REDATAM, es la generación de base de datos para este software, por lo que, y debido a que tenemos una comunidad grande y creciendo de programadores en lenguaje R, me di a la tarea de escribir (e investigar) líneas para construir nuestro archivo de tipo CSV que será la base para generar nuestra base de datos REDATAM.

 Como purista, clásico y tal vez necio he creado una máxima: si el archivo esta con una determinada extensión (en este caso DBF - archivos XBase) pues hagamos su explotación en su software de origen, en este caso Microsoft Visual FoxPro que es el último que maneja este tipo de archivos.

Sin embargo, reitero que tenemos que atraer al nicho de programadores de R que son todos mis compañeros de dirección así que vamos a crear un archivo con el cual mostraremos el proceso de creación de base de datos con código R, pasaremos al módulo Red7 Create, usando la utilería Red7 Admin y por última su explotación con Red7 Process y si podemos permear la factibilidad de REDATAM no depender de algunos pocos como yo (preguntaba mi ahora jefe ¿y si ya no estás, quién construirá las bases de datos?).

Además, me dije a mi mismo, R es un lenguaje de programación por lo cual y gracias a la infinidad de colaboradores que hay en el mundo existen cantidad de paquetes para hacer todo tipo de tareas, en este caso específico, la creación de archivos de texto.

 Basado en mis ideas anquilosadas lo primero que busqué fue que el dataset que trabajaremos que para este caso es un DBF el archivo resultante de texto sean textos y que aquel numérico que tenga por ejemplo el valor 2 y la variable o columna espera tres posiciones lo podamos convertir 002.

Quizás no vale la pena, pero debido a la importancia que el formato CSV está tomando en el Instituto, quiero restituir la entrada de datos en Red7 Create con archivos de este tipo, aunque Lenin, nos recomienda los archivos de tipo CSPro.

Reitero que REDATAM en su versión última disponible tiene bugs, que aquí mostraré como lo solucioné para este caso, y quizás están ahí porque la opción no se utiliza o se utiliza muy poco.

Vamos a trabajar las defunciones tomando para manera de ejemplo las variables (columnas) de entidad de registro (ENT_REGIS), municipio de registro (MUN_REGIS), sexo (SEXO) y escolaridad (ESCOLARIDA).

Lo primero que tenemos que saber y aplicar es la lectura del DBF que mi jefe muestra y documenta para la encuesta llamada Encuesta Nacional sobre Consumo de Energéticos en Viviendas Particulares (ENCEVI) y que puedes consultar en el siguiente enlace.

Una vez leído el archivo DBF se hace una consulta que de acuerdo con la experiencia en el área la hacemos con el paquete dplyr para extraer, recodificar y ordenar las variables que vamos a usar, REDATAM es una base de datos jerárquica por lo que ordenaremos por entidad y municipio, una forma de recodificar la variable (columna) ESCOLARIDA fue usando mutate con el comando ifelse.

Como antecedente se intento hacer un recorrido secuencial y aplicar una función para poner los ceros a la izquierda, pero esta opción llevaba mucho tiempo.

Se hicieron varios intentos con diversas formas de archivos CSV y al final la que funcionó es la que se muestra aquí resaltando lo siguiente:

1.       Archivos CSV sin comillas y evitando un campo que se agrega que es como un consecutivo.

2.       Muy importante es la codificación del archivo que es ANSI (para R cp1252).





Me detengo un poco y hago un paréntesis para explicar dplyr comparándolo con SQL esto en el caso de la recodificación de escolaridad.

En dplyr:

bdredatam <- bdmorta %>% mutate(ESCOLA0 = ifelse(str_length(as.character(ESCOLARIDA))==1,                                       paste("0",as.character(ESCOLARIDA),sep=""),                                         ifelse(str_length(as.character(ESCOLARIDA))==2,                                                        as.character(ESCOLARIDA)," ")))

En PL-SQL:

SELECT

CASE

        WHEN length(trim(ESCOLARIDA)) == 1 THEN “0” | ESCOLARIDA

        ELSE ESCOLARIDA

END ESCOLA0… FROM TDEFUN

El resultado – archivo resultante – es el siguiente:

Ahora pasamos a Red 7 Create. Lo que haremos es crear la jerarquía de la base de datos, en este punto nos podemos apoyar en este artículo de mi blog o bien ver el video. La jerarquía quedaría así:



Ahora debemos relacionar esta jerarquía con el archivo de entrada que es el CSV, para ello se elige la opción DATASET DEFINITION – Connect – CSV. También podemos observar este proceso en el blog y en el video.


Después de relacionar los campos (columnas) con la jerarquía se tiene que generar la base de datos.

En este momento se envía el mensaje de error que varía con el de la versión que documenté en 2016, y señala que no encuentra los nombres de las columnas, cuando como observamos si los tiene.


Entonces procedemos dar clic en el botón “Aceptar” y guardar el archivo de la jerarquía (extensión WipX).


 Cerramos el módulo de Red7 Create y procedemos a abrirlo con un editor de textos.


Procedemos a eliminar la línea 21 (etiqueta <csvLimitator>) y guardamos el archivo. Nuevamente entramos a Red7 Create abrimos el archivo WipX y nuevamente tratamos de generar la base de datos.


Podemos observar que la base de datos se ha generado con éxito.

Vamos ahora con un paso más, agregar los códigos geográficos y para ello vamos a entrar a otro módulo llamado Red7 Admin (este proceso se detalla en esta entrada del blog).

Red7 Admin.

Otra vez escribí un programa en R para hacer algo muy útil para REDATAM que son los catálogos, archivos de texto que identifican un código con una descripción, aquí se muestra por ejemplo el de la entidad de registro. Este proceso y el primer cruce en Red7 Process lo pueden consultar en este video.


Al ser un dato caracter (si pudieron observar el artículo y video estas variables son las que determinan la jerarquía) las variables de código se les antepone un 0 a la izquierda, al ser un catálogo tan pequeño no hay problema para hacerlo inclusive manualmente.

Sin embargo, para el siguiente nivel ya son muchos registros y es un dato compuesto (2 caracteres entidad y 3 para el municipio p.e. 01002 Calvillo) entonces vale la pena hacer un programa en R.

Para este caso tenemos un catálogo de localidades donde también están los municipios y las entidades.


Solo necesitamos aquellos donde la clave de municipio (Cve_mun) sea diferente de 000 y la clave de localidad (Cve_loc) sea igual a 0000.

Con esto teníamos ya un catálogo entidad y municipio, lo que no pude conseguir es que me respetara los acentos por lo que lo depuré usando el software Notepad++.

Procedemos ahora a agregar estos códigos geográficos, por lo que vamos a entrar a Red7 Admin. En la pestaña File vamos a darle clic al botón Red7 Dictionary para abrir el diccionario que generamos previamente en Red7 Create.


Quizás este proceso será repetitivo, pero lo explico nuevamente, tomamos la rama de la desagregación geográfica (en este caso la entidad) damos clic derecho y se muestra el menú contextual y se elige la opción “Add variable” (o se presiona la tecla “Ins”). A esta variable le ponemos un nombre significativo, REDATAM las identifica como “Entity Label” (rótulo de entidad), por lo que vamos a llamarle “ENT_ROT”, procedemos configurar las opciones como “Label” (rótulo).


Technical Specifications (especificaciones) donde decimos de que tamaño será el rótulo o etiqueta, además del tipo.


Y por último vamos a identificar de donde vamos a importar el catálogo alfabético (ruta y nombre del archivo), su separador (space), el tipo de archivo (ASCII File), etc.



 Entonces se da clic en el botón “Import File”.


Con esto ya se creo la variable de rótulos exitosamente ahora tenemos que darle esta denominación, nos vamos a la rama, damos clic derecho para abrir el menú contextual y elegimos la opción “Properties” e indicamos que esta nueva variable es la “Label Variable”.


Damos clic en “OK” y ya terminamos, hacemos el mismo proceso para la rama de MUN, y asociamos el archivo de rótulos o etiquetas repitiendo el proceso antes descrito y antes de salir de Red7 Admin guardamos el diccionario. Una vez concluido el proceso procedemos a la explotación de la base de datos.

Red7 Process.

Por último, vamos a hacer un cruce sencillo utilizando tres variables una de ellas con área de quiebre.

Nos vamos a la pestaña llamada STATISTICAL PROCESSOR y elegimos la opción de Crosstab.


En este caso hacemos un cruce de “Escolaridad” y Sexo, ahora vamos a agregar el corte en la pestaña “Advanced”, donde decimos que el “Area Break” es por entidad.


Damos clic en el botón ejecutar (a un lado de los lentes) y vemos el resultado.



Y hasta aquí esta explicación que espero sea de utilidad.

Hasta el próximo post.

Miguel Araujo.



Comentarios

Entradas populares de este blog

Librería de REDATAM para R

Conectar bases de datos Oracle con R vía JDBC

Red 7 Admin