R/g_obtener_indicadores.R

Defines functions g_obtener_indicadores

Documented in g_obtener_indicadores

#' Función para obtener los indicadores de la población de México
#'
#' Obtiene los indicadores de la población mexicana desde la API del INEGI
#'
#' @param nivel character - indica el nivel al que se obtendrán los datos, ya sea: "nacional" o "municipal"
#'
#' @param anio character - indica el año del que se requiere la información, en el caso del nivel "nacional" solo hay información para el 2010, por lo que se puede omitir.
#'
#' @return un data.frame con la información solicitada
#'
#' @examples  g_obtener_indicadores(nivel="nacional",anio = "2015")
#'  g_obtener_indicadores(nivel="municipal")


g_obtener_indicadores <- function(nivel = "nacional",anio = "2010"){
  # Carga de librerias----
  library(httr)
  library(jsonlite)
  library(rjson)
  library(dplyr)
  library(purrr)
  library(foreach)
  library(rlist)

  ######### Declaramos las funciones auxiliares.

  # Funcion para extraer los datos de una pagina
  extraer <-  function(url){
    url %>%
      GET() %>%
      content("text",encoding = "UTF-8") %>%
      paste(collapse = " ") %>%
      fromJSON()
  }
  # Convierte la información extraida en un data.frame
  df_edo<-function(estados){
    estados <- estados %>%
      pluck("datos") %>%
      reduce(rbind) %>%
      data.frame() %>%
      dplyr::select(cve_agee,nom_agee)
    return(estados)
  }

  # Función para seleccionar la clave del estado
  obtiene_clave_estado<-function(estados){
    cv_edo <- estados %>%
      dplyr::select(cve_agee) %>%
      unlist()
    names(cv_edo) <- estados$nom_agee
    return(cv_edo)
  }

  # Función para extraer los municipios
  obtener_municipios <- function(Estado){
    url <- paste0("https://gaia.inegi.org.mx/wscatgeo/mgem/",Estado)
    municipios <- extraer(url)
    return(municipios)
  }
  # Función para convertir la información en un data.frame
  df_mun <- function(estado){
    municipios <- municipios %>%
      pluck(estado,"datos") %>%
      reduce(rbind) %>%
      data.frame() %>%
      dplyr::select(cve_agee,cve_agem,nom_agem,pob,pob_fem,pob_mas)
  }
  # Función para obtener los indicadores a nivel nacional
  obtener_indicadores_nacional <- function(area,anio){
      # Nombre de los indicadores
      nombres <- c('Población',
                   'Hombres',
                   'Mujeres',
                   '0a4 anios',
                   '5a9 anios',
                   '10a14 anios',
                   '15a19 anios',
                   '20a24 anios',
                   '25a29 anios',
                   '30a34 anios',
                   '35a39 anios',
                   '40a44 anios',
                   '45a49 anios',
                   '50a54 anios',
                   '55a59 anios',
                   '60a64 anios',
                   '65a69 anios',
                   '70a74 anios',
                   '75a79 anios',
                   '80a84 anios',
                   '85a89 anios',
                   '90a94 anios',
                   '95a99 anios',
                   '100 anios y más'
      )
      # Creamos el url de la página de donde obtenereos la información
      url = paste0("https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000001,1002000002,1002000003,1002000058,1002000061,1002000067,1002000070,1002000073,1002000076,1002000079,1002000082,1002000088/es/",area,"/false/BISE/2.0/959285de-3d6b-0a30-cfab-e39ece21fbae?type=json")
      # Extraemos la informacíon de la página
      flujoDatos <- extraer(url)
      # Extraemos los indicadores
      datos = foreach(i=1:length(flujoDatos$Series)) %do%{
        v <-flujoDatos %>% pluck("Series",i,"OBSERVATIONS") %>%
          list.filter(TIME_PERIOD==anio) %>%
          pluck(1,1)
        if (is.null(v)) {
          valor = ""
        }else{
          valor = flujoDatos %>%
            pluck("Series",i,"OBSERVATIONS") %>%
            list.filter(TIME_PERIOD==anio) %>%
            pluck(1,"OBS_VALUE") %>%
            as.numeric()
        }
      }


      datos1 <- data.frame(datos)

      names(datos1) <- c('Población',
                         'Hombres',
                         'Mujeres',
                         '0a4 anios',
                         '10a14 anios',
                         '15a19 anios',
                         '20a24 anios',
                         '25a29 anios',
                         '30a34 anios',
                         '35a39 anios',
                         '40a44 anios',
                         '5a9 anios')

      # Creamos el url de la página de donde obtenereos la información
      url = paste0("https://www.inegi.org.mx/app/api/indicadores/desarrolladores/jsonxml/INDICATOR/1002000085,1002000091,1002000094,1002000097,1002000100,1002000103,1002000106,1002000109,1002000112,1002000115,1002000118,1002000064/es/",area,"/false/BISE/2.0/959285de-3d6b-0a30-cfab-e39ece21fbae?type=json")
      # Extraemos los datos de la página
      flujoDatos <- extraer(url)
      #Extraemos los indicadores
      datos2 = foreach(i=1:length(flujoDatos$Series)) %do%{
        v <-flujoDatos %>% pluck("Series",i,"OBSERVATIONS") %>%
          list.filter(TIME_PERIOD==anio) %>%
          pluck(1,1)
        if (is.null(v)) {
          valor = ""
        }else{
          valor = flujoDatos %>%
            pluck("Series",i,"OBSERVATIONS") %>%
            list.filter(TIME_PERIOD==anio) %>%
            pluck(1,"OBS_VALUE") %>%
            as.numeric()
        }
      }

      datos2 <- data.frame(datos2)

      names(datos2) <- c('100 anios y más',
                         '45a49 anios',
                         '50a54 anios',
                         '55a59 anios',
                         '60a64 anios',
                         '65a69 anios',
                         '70a74 anios',
                         '75a79 anios',
                         '80a84 anios',
                         '85a89 anios',
                         '90a94 anios',
                         '95a99 anios'
      )

      datos <- cbind(datos1,datos2)

      datos <- datos[nombres]

      return(datos)

  }


  obtener_indicadores_municipal <- function(area){
    # Nombre de los indicadores
      nombres <- c('Población',
                   'Hombres',
                   'Mujeres'
      )
      # Creamos la url de la página
      url <- paste0("https://gaia.inegi.org.mx/wscatgeo/mgem/",area)
      municipios <- extraer(url)

      municipios <- municipios %>%
        pluck("datos") %>%
        reduce(rbind) %>%
        data.frame() %>%
        dplyr::select(cve_agee,cve_agem,nom_agem,pob,pob_fem,pob_mas)

      names(municipios)[names(municipios)%in%c("pob","pob_fem","pob_mas")] <- nombres
      rownames(municipios) <- NULL
      # Creamos un filtro para quitar los municipios sin información
      municipios$Población <- as.numeric(municipios$Población)
      municipios <- municipios[!is.na(municipios$Población),]


      return(municipios)

    }

  ####### Ejecucion
    # url de la página del catalogo de entidades
  url <- "https://gaia.inegi.org.mx/wscatgeo/mgee/"

  # Extraemos el catalogo
  estados  <- extraer(url)

  # Generamos un data.frame con los datos
  estados <- df_edo(estados)

  #Obtenemos la clave de cada estado
  cv_edo <- obtiene_clave_estado(estados)
  # Creamos los códigos como nos los pide la API
  estados <- estados %>%
    mutate(nom_agee = paste(cve_agee,nom_agee)) %>%
    mutate(cve_agee = ifelse(nchar(cve_agee)==1,paste0("0700000",cve_agee),paste0("070000",cve_agee)))
  # Agregamos el código del nivel nacional
  estados <- rbind(estados,c("0700","00 Nacional"))
  #Obtenemos la información de los municipios
  municipios <- cv_edo %>%
    map(obtener_municipios)

  municipios <- names(cv_edo) %>%
    map(df_mun) %>%
    reduce(rbind)

  municipios <- municipios %>%
    mutate(nom_agem = paste(cve_agee,cve_agem,nom_agem,sep = "_")) %>%
    mutate(cve_agee = paste0("070000",cve_agee)) %>%
    mutate(cve_agem = paste0("0",cve_agem)) %>%
    mutate(codigo_mun = paste0(cve_agee,cve_agem))

  # Extraemos la información de los Estados y la guardamos en un data.frame
  if (nivel == "nacional") {
    codigo_edo <- estados$cve_agee

    distribucion <- codigo_edo %>%
      map(anio = anio,obtener_indicadores_nacional) %>%
      reduce(rbind)

    rownames(distribucion) <- estados$nom_agee

    distribucion <- add_rownames(distribucion,"Estados")

  }

  if (nivel == "municipal") {
    # Extraemos la información del municipio
    codigo_edo <- cv_edo

    distribucion <- codigo_edo %>%
      map(obtener_indicadores_municipal) %>%
      reduce(rbind) %>%
      data.frame()

  }

return(distribucion)

}
pelishk/upax_library documentation built on Nov. 28, 2022, 10:45 a.m.