Definición de loop (o bucle)
Es un proceso para automatizar tareas repetitivas
¿Qué pasos se llevan a cabo para la descarga de las bases de datos de estaciones climatológicas en la CDMX (ejemplo visto en clase)?
Identificamos la página de consulta dentro del sitio del Servicio Meteorológico Nacional en la sección de Climatología y luego en Información Estadística Climatológica (https://smn.conagua.gob.mx/es/climatologia/informacion-climatologica/informacion-estadistica-climatologica)
Descargamos la base de datos con la función read_table2 porque es archivo de texto plano, y la ubicamos dentro de la carpeta de Datos Conagua
Con mutate crea una nueva variable, Estacion, con el 9051 como identificador. Luego la guardamos en el objeto bd y la exportamos a nuestra computadora con el write.csv, agregando el False para los nombres, y el na para los espacios, además del UTF-8
library(tidyverse)
library(curl)
library(zip)
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")
Luego sustituimos la parte variable por un objeto y con el paste0 separamos la parte variable del código, es decir, descomponemos la parte fija de la parte variable para después meterlo en un loop
estacion <- "9051"
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")
Generamos el loop con los valores que van del 9001 al 9100 y quitamos de la secuencia los valores que dan error
serie <- 9001:9100
# Vamos quitando de la secuencia los valores que nos dan error...
for (estacion in serie[-c(18, 27, 35, 53, 57, 60, 1:61)]){
print(estacion)
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")
}
Y utilizamos otra alternativa, con mensajes de error para que los ignore, es decir, con el tryCatch
for (estacion in serie){
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))
})
}
Dados los otros tres ejemplos (descarga de datos de tabulados de vivienda de INEGI, descarga automática de datos de COVID y descarga de datos de cartografía electoral del INE), seleccionamos uno para realizar la misma descripción que en el ejercicio previo.
Primero descargamos los datos del INEGI para conocer el porcentaje de hogares con televisión en la url de consulta (https://www.inegi.org.mx/programas/intercensal/2015/default.html#Tabulados) y la url de descarga (https://www.inegi.org.mx/contenidos/programas/intercensal/2015/tabulados/14_vivienda_mor.xls)
Descargamos la base de datos con la función curl
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")
Luego 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")
Conseguimos los demás 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")
Hacemos 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"))
}