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.
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
Publicar un comentario