Ejercicio 1: Definición de loop o bucle

Un loop, por defición, es una repetición. En este caso parte de la automatización de un proceso de tareas repetitivas. Para ello hay que definir qué tarea se quiere realizar, identificar las variables, defino la secuencia y posteriormente verificar si el resultado era el propuesto.

Ejercicio 2: Describir los pasos que se llevaron a cabo para la descarga de las bases de datos de estaciones climatológicas en la CDMX

Primer paso: Descarga las librerías que son necesarias para este proceso:

library(tidyverse)
library(curl)
library(zip)

Segundo paso: Descarga una primera base de datos para comprobar que funcione la descarga. Explore los elementos del enlace. En ese caso el 9051 es el código de la estación en Tláhuac:

# Descarga n = 1
# https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/9051.txt ## Estación Meteorológica Tláhuac. 

Tercer paso: A través de la función mutate genera una nueva columna con el elemento 9051. Aprovecha para que con el UTF-8 la lectura de los datos sea en español:

# Descarga n = 1
bd <- read_table2("https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/9051.txt", 
                  skip = 20) %>% 
  mutate(Estacion = "9051") 

write.csv(bd, file = "01_Datos/Datos Conagua/9051.csv", row.names = F, na = "", fileEncoding = "UTF-8")

Cuarto paso: Creamos un objeto con el elemento 9051:

estacion <- "9051"

Quinto paso: leemos la tabla y con la función paste0 desagregamos el URL, colocando el objeto “estacion” en medio para así poderlo manipular en la secuencia:

bd <- read_table2(paste0("https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/", estacion , ".txt"), 
                  skip = 20) %>% 
  mutate(Estacion = estacion) 

write.csv(bd, file = paste0("01_Datos/Datos Conagua/", estacion,".csv"), row.names = F, na = "", fileEncoding = "UTF-8")

Sexto paso: Generamos un loop de la serie serie con los elementos que pensamos pueden descargarse. La de Tláhuac era la 9051, entonces presupuestamos que inicia en el 9001 y como ya vi que son menos de 100 estaciones, hacemos la secuencia hasta el 9100:

serie <- 9001:9100

Séptimo paso: Al correrlo, nos damos cuenta que hay errores (que no se descarga ese número de estación, en este caso). Por tanto vamos quitando esos números cuando se imprima “estacion”. En este caso las 18, 27, 35, 53, 57, 60 son las del error. Y como nuestra serie llegaba hasta el 100, también quitamos del 61 al 100.

Algo que es importante es que las {} (llaves) nos permiten meternos a una celda y manipular el contenido de la observación (celda).

# Vamos qutando de la secuencia los valores que nos dan error...
for (estacion in serie[-c(18, 27, 35, 53, 57, 60, 61:100)]){
print(estacion)
bd <- read_table2(paste0("https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/", estacion , ".txt"), 
                  skip = 20) %>% 
  mutate(Estacion = estacion) # Sacrificamos un renglon :P 

write.csv(bd, file = paste0("01_Datos/Datos Conagua/", estacion,".csv"), row.names = F, na = "", fileEncoding = "UTF-8")
}

Octavo paso: Con tryCatch nos permite ignoramos el error cuando al correrlo nos marca error. Esta función tiene dos argumentos. El primero es el proceso a ejecutar; mientas que el segundo es la función que queremos que realice en caso de que ocurra un error, a través del argumento “error”:

# Otra alternativa: Con mensajes de error!
for (estacion in serie){
  
  # Intenta envolver el código de arriba en un tryCatch.
  # Un tryCatch es una función que nos permite correr un código, pero que si este nos da error, lo ignore e intente hacer otra cosa.
  # Sus argumentos son: 1) El proceso a ejecutar, y 2) la función a realizar en caso de que ocurra un error, a través del argumento `error`.
  tryCatch({
    bd <- read_table2(paste0("https://smn.conagua.gob.mx/tools/RESOURCES/Diarios/", estacion , ".txt"), 
                      skip = 20) %>% 
      mutate(Estacion = estacion) # Sacrificamos un renglon :P 
    
    write.csv(bd, file = paste0("01_Datos/Datos Conagua/", estacion,".csv"), row.names = F, na = "", fileEncoding = "UTF-8")  
  }, 
  # ... y si hay un error, haz esto, ignoralo y sigue adelante :B
  error = function(e){
    print(paste0("Error en la estacion ", estacion))
  })

}

Como nos podemos dar cuenta, cuando apareció error, le pedimos que nos imprimiera una leyenda que dijera “Error en la estación” y el número de la estación del objeto “estación”.

Aquí podemos ver cómo se generó la descarga.

Ejercicio 3: Descarga y descripción de descarga de datos de tabulados de vivienda de INEGI.

Primer paso: Descarga las librerías que son necesarias para este proceso:

library(tidyverse)
library(curl)
library(zip)

Segundo paso: Descarga la base de datos y analiza la URL de descarga y asigna la carpeta donde la guardaras:

# Url de consulta: 
# https://www.inegi.org.mx/programas/intercensal/2015/default.html#Tabulados

# Urls de descarga: 
# https://www.inegi.org.mx/contenidos/programas/intercensal/2015/tabulados/14_vivienda_mor.xls

 #Caso n = 1: 
curl::curl_download(url = "https://www.inegi.org.mx/contenidos/programas/intercensal/2015/tabulados/14_vivienda_mor.xls", 
                    destfile = 
                      "01_Datos/Datos Censo/HogaresMorelos.xls")

Tercer paso: El elemento “mor” lo convertimos identificamos y lo guardamos en un objeto. Posteriomente colocamos el objeto como variable dentro de la URL.

# Reemplazamos la parte variable con objetos: 
estado = "mor"
curl::curl_download(url = paste0("https://www.inegi.org.mx/contenidos/programas/intercensal/2015/tabulados/14_vivienda_", estado, ".xls"), 
                    destfile = "01_Datos/Datos Censo/HogaresMorelos.xls")

Cuarto paso: Conseguimos la clave de los estados como en teoría aparecerán en la URL para poder descargarlos.

# Conseguimos los demas estados: 
edos <- c("ags", "bc", "bcs", "camp","coah", "col","chis", "chih", "DF", 
          "dgo", "gto", "gro", "hgo", "jal", "mex", "mich","mor", "nay", "nl", "oax_D", "pue", "qro", "qroo","slp", "sin", "son","tab","tamps","tlax","ver","yuc","zac")

Quinto paso: Generamos el loop y le decimos donde queremos que guarde las bases de datos descargadas:

# Planteamos el loop de descarga: 
for(estado in edos){
  print(estado)
  curl::curl_download(url = paste0("https://www.inegi.org.mx/contenidos/programas/intercensal/2015/tabulados/14_vivienda_", estado, ".xls"), 
                      destfile = paste0("01_Datos/Datos Censo/Hogares", estado, ".xls"))
}

Aquí podemos ver cómo se generó la descarga.