1. ¿Qué es un loop?

Un loop es un proceso en R para, a partir de una base de datos abiertos, automatizar las tareas repetidas. Es decir, realizar un código para bajar datos, identificar las partes variables, y cambiarlas en R con el fin de no bajar, una por una, todas las bases.

En este proceso podemos usar la función "FOR" para realizar bucles o ciclos, o sea, para que un proceso se realice hasta que se cumpla cierta condición. En este ciclo podemos saber si algo tronó (o sea que no corrió) y poder corregirlo.

Pensar siempre: ¿qué es lo que quiero obtener con este proceso?

2. ¿Qué pasos se llevan a cabo para la descarga de las bases de datos de estaciones climatológicas en la CDMX?

2.1. Librerías:

a) library(curl): Para descargar archivos de internet .zips y .xlsx.

b) library(zip): Para descomprimir archivos de internet.

c) library(tydiverse)

2.2. Definir qué datos quiero

2.3. Ubico la base de datos en internet

Ejemplo: https://smn.conagua.gob.mx/es/climatologia/informacion-climatologica/informacion-estadistica-climatologica

Nota: en la esquina superior derecha hay un botón para acceder a nuevos links que contienen las bases de datos

2.4. Función para guardar archivos de internet

curl::curl_download(url = "https://smn.conagua.gob.mx/es/climatologia/informacion-climatologica/informacion-estadistica-climatologica", destfile = "01_Datos/climas") Carpeta donde quiero que se guarde.

Evitamos volver a internet a buscar la base de datos.

2.5. Copiar URL de txt

De todas las estaciones del país, seleccionar una e irse a "climatología diaria" para obtener los datos de esa estación.

Copiar la URL y pegar en R (terminación txt).

"https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/9036.txt" # Playa Caleta 454, Colonia Marte, Iztacalco, Ciudad de México.

"https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/9068.txt"

Ubicación de dos archivos distintos de climatología.

Nota: Analizar qué numerología cambia en el link. En este caso la variable es 36 y 68.

2.6. Tomamos "Iztacalco"

a) Importamos datos: Import Dataset -> Importar datos

b) Limpiar/filtrar la base de datos: Locale + skip + delimiter

Código generado: bd <- read_table2(paste0("https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/90", estacion ,".txt"), locale = locale(encoding = "ISO-8859-1"), skip = 18)

2.7. Hacer el loop

Nota: si comienza con "9" es para Ciudad de México.

estacion <- 36

bd <- read_table2(paste0("https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/90", estacion, locale = locale(encoding = "ISO-8859-1"), skip = 18)

¿Qué hicimos? sustituimos "36"" por "estación"", que es el número variable.

Y así podemos seguir con los ejemplos:

estacion <- 01

estacion <- 02

estacion <- 03...

2.8. Guardar estos datos en archivos independientes

write.csv(bd, paste0("01_Datos/Datos Conagua/90", estacion,".csv"))

Nota: "estacion" va a tomar la variable que deseemos guardar para todos los casos. Y así cambiar uno por uno.

Peeero cambiar número por número es ineficiente, así que hay que generar un sistema automatizado.

2.9. Automatizar descargas

Ejemplo: c(paste0("0", 1:9), 10:99)

Aquí generamos secuencias: 01, 02, 03, 04... hasta 99.

2.10. Construir con "FOR"

for(estacion in c(paste0("0", 1:9), 10:99)){

print(estacion)

Nota: si se corta, por ejemplo en el 18, hacer lo siguiente:

for(estacion in c(paste0("0", 1:9), 10:17, 19:99)){

Nos saltamos el 18 y ahora correrá del 19 al 99.

print(estacion)

2.11. ¿Y si truena?

La forma más sencilla es: con tryCatch({

bd <- read_table2(paste0("https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/90", estacion ,".txt"), locale = locale(encoding = "ISO-8859-1"), skip = 18)

write.csv(bd, paste0("01_Datos/Datos Conagua/90", estacion,".csv"))

Hasta aquí tenemos una descarga automatizada... pero, ¿y si truena por alguna variable que no está?

tryCatch({

bd <- read_table2(paste0("https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/90", estacion ,".txt"), locale = locale(encoding = "ISO-8859-1"), skip = 18)

write.csv(bd, paste0("01_Datos/Datos Conagua/90",estacion,".csv")) }, error = function(e){ print(paste0("Algo tronó en el paso ", estacion, " T__T")) } ) }

Nota: Al correr el código nos saldrá una alerta de que algo tronó, así que la podremos detectar con la leyenda: "Algo tronó en el paso"

3.- Descarga automatizada INE

3.1. Librerías

a) library(tidyverse)

b) library(curl)

c) library(zip)

3.2. Definir qué datos quiero

Ubicación de los 300 distritos federales ntre 2016 y 2017.

3.3. Guardar y dezipear

curl::curl_download(url = "https://cartografia.ife.org.mx//descargas/distritacion2017/federal/01/01.zip", destfile = "01_Datos/Datos INE/01.zip")

Aquí descargamos y guardamos la primera descarga.

zip::unzip("01_Datos/Datos INE/01.zip", exdir = "01_Datos/Datos INE")

Aquí descomprimimos los datos.

3.4. Analizamos numerología

edo <- "09" Ejemplo

curl::curl_download(url = paste0("https://cartografia.ife.org.mx//descargas/distritacion2017/federal/", edo, "/", edo, ".zip"), destfile = paste0("01_Datos/Datos INE/", edo, ".zip")) zip::unzip(paste0("01_Datos/Datos INE/", edo, ".zip"), exdir = "01_Datos/Datos INE")

Lo marcado en negritas en el link anterior (edo, "/", edo, ") fue sustituido en lugar de "01/01", para que el valor de "edo" sea cambiante.

3.6. Generamos el ciclo

for (edo in c(paste0("0", 1:9), 10:32)){

Usamos "FOR" para especificar el ciclo automatizado que queremos. En este caso estamos indicano que queremos del 01, 02, 03... hasta el 09, y del 10, 11, 12... hasta el 32.

curl::curl_download(url = paste0("https://cartografia.ife.org.mx//descargas/distritacion2017/federal/", edo, "/", edo, ".zip"), destfile = paste0("01_Datos/Datos INE/", edo, ".zip")) zip::unzip(paste0("01_Datos/Datos INE/", edo, ".zip"), exdir = "01_Datos/Datos INE") print(paste0(edo, "... EXITO!")) }

En esta última parte, dado que al bajar los datos "no tronó" nada, no fue necesario usar el tryCatch.

{width='100px'} {width='100px'}

Los datos dezipeados de las 32 carpetas quedaron almacenados en nuestra computadora de la siguiente manera:

{width='100px'}