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?
a) library(curl): Para descargar archivos de internet .zips y .xlsx.
b) library(zip): Para descomprimir archivos de internet.
c) library(tydiverse)
Nota: en la esquina superior derecha hay un botón para acceder a nuevos links que contienen las bases de datos
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.
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.
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)
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...
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.
Ejemplo: c(paste0("0", 1:9), 10:99)
Aquà generamos secuencias: 01, 02, 03, 04... hasta 99.
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)
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"
a) library(tidyverse)
b) library(curl)
c) library(zip)
Ubicación de los 300 distritos federales ntre 2016 y 2017.
https://cartografia.ife.org.mx/sige7/?distritacion=federal
Enlaces de descarga:
https://cartografia.ife.org.mx//descargas/distritacion2017/federal/01/01.zip https://cartografia.ife.org.mx//descargas/distritacion2017/federal/02/02.zip https://cartografia.ife.org.mx//descargas/distritacion2017/federal/32/32.zip
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.
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.
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'}