R/checking_data.R

Defines functions calcular_incidencia_sex calcular_incidencia_geo calcular_incidencia agrupar_per_etn agrupar_tipo_caso agrupar_years agrupar_eventos agrupar_top_area_geo agrupar_area_geo agrupar_mpio agrupar_dpto agrupar_edad_sex agrupar_edad agrupar_sex_semanaepi agrupar_sex agrupar_fecha_inisintomas agrupar_rango_edad agrupar_cols_casos agrupar_semanaepi geo_filtro

Documented in agrupar_area_geo agrupar_cols_casos agrupar_dpto agrupar_edad agrupar_edad_sex agrupar_eventos agrupar_fecha_inisintomas agrupar_mpio agrupar_per_etn agrupar_rango_edad agrupar_semanaepi agrupar_sex agrupar_sex_semanaepi agrupar_tipo_caso agrupar_top_area_geo agrupar_years calcular_incidencia calcular_incidencia_geo calcular_incidencia_sex geo_filtro

#' @title Filtrar por departamentos y municipios
#' @description Función que filtra los datos de una enfermedad o evento por
#' departamentos y municipios.
#' @param data_event Un `data.frame` con los datos de una enfermedad o evento.
#' @param dpto Un `character` (cadena de caracteres) o `numeric` (numérico)
#' que contiene el nombre o código del departamento; valor por defecto `NULL`.
#' @param mpio Un `character` (cadena de caracteres) o `numeric` (numérico)
#' que contiene el nombre o código del municipio; su valor por defecto
#' es `NULL`.
#' @return Un `data.frame` con los datos filtrados con la enfermedad,
#' departamentos y municipios seleccionados.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' geo_filtro(data_event = data_limpia, dpto = "ANTIOQUIA")
#' geo_filtro(data_event = data_limpia, dpto = "ANTIOQUIA", mpio = "MEDELLIN")
#' geo_filtro(data_event = data_limpia, dpto = "05")
#' geo_filtro(data_event = data_limpia, dpto = "05", mpio = "05001")
#' geo_filtro(data_event = data_limpia, dpto = 05, mpio = 05001)
#' geo_filtro(data_event = data_limpia, dpto = 05, mpio = 001)
#' geo_filtro(data_event = data_limpia, dpto = "bogota dc", mpio = "bogota dc")
#' @export
geo_filtro <- function(data_event, dpto = NULL, mpio = NULL) {
  validar_data_event(data_event)
  data_dept_filt <- data.frame()
  dept_data <- data.frame()
  cols_ocurren <- NULL
  if (!is.null(dpto)) {
    dept_data <- obtener_info_depts(dpto, mpio)
    stopifnot(
      "El departamento o municipio ingresado no existe" = nrow(dept_data) > 0
    )
    dept_data <- dept_data[1, ]
    cols_ocurren <- obtener_tip_ocurren_geo(data_event[["cod_eve"]][1])
  }
  if (!is.null(dept_data)) {
    data_dept_filt <-
      dplyr::filter(
        data_event,
        data_event[[cols_ocurren[1]]] %in% dept_data$codigo_departamento
      )
  }
  if (!is.null(mpio)) {
    stopifnot(
      "El parametro mpio debe ser una cadena de caracteres o un
              numero" = is.character(mpio) | is.numeric(mpio)
    )
    data_dept_filt[[cols_ocurren[3]]] <-
      as.character(data_dept_filt[[cols_ocurren[3]]])
    data_dept_filt <-
      dplyr::filter(
        data_dept_filt,
        data_dept_filt[[cols_ocurren[3]]] %in%
          as.character(dept_data$codigo_municipio)
      )
  }
  return(data_dept_filt)
}

#' @title Agrupar por semana epidemiológica y casos
#' @description Función que agrupa los datos de una enfermedad o evento
#' por semana epidemiológica y número de casos.
#' @param data_event Un `data.frame` que contiene los datos de
#' una enfermedad o evento.
#' @param col_semanaepi Un `character` (cadena de caracteres)
#' con el nombre de la columna que contiene las semanas
#' epidemiológicas en los datos de la enfermedad o evento;
#' su valor por defecto es `"semana"`.
#' @return Un `data.frame` con los datos de una enfermedad o
#' evento agrupados por semana epidemiológica y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_semanaepi(
#'   data_event = data_limpia,
#'   col_semanaepi = "semana"
#' )
#' @export
agrupar_semanaepi <- function(data_event,
                              col_semanaepi = "semana") {
  validar_data_event(data_event)
  stopifnot(
    "El parametro col_semanaepi debe ser una cadena de caracteres" =
      is.character(col_semanaepi)
  )
  data_event_agrupada <- dplyr::group_by(
    data_event,
    dplyr::across(dplyr::all_of(col_semanaepi))
  )
  data_event_agrupada <- dplyr::summarise(data_event_agrupada,
    casos = sum(.data$uni_med)
  )
  data_event_agrupada <- data_event_agrupada[1:53, ]
  return(data_event_agrupada)
}

#' @title Agrupar por columnas y casos
#' @description Función que agrupa los datos de una enfermedad o evento
#' por nombre de columna(s) y número de casos.
#' @param data_event Un `data.frame` que contiene los datos de
#' una enfermedad o evento.
#' @param nomb_cols Un `character` (cadena de caracteres) o
#' `array (arreglo) de character` que contiene el nombre de
#' la(s) columna(s) en los datos de la enfermedad o evento.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica
#' si se debe agregar una columna con el porcentaje de casos;
#' su valor por defecto es `FALSE`.
#' @param estandar Un `logical` (TRUE o FALSE) que indica
#' si se debe utilizar el estándar de agrupación de los datos
#' del evento o enfermedad propuesto por el paquete, es decir,
#' que se incluyan estas columnas o variables como parte del
#' resultado `c("cod_eve", "nombre_evento", "ano")`; su valor
#' por defecto es `TRUE`, si su valor es `FALSE` agrupará los
#' datos solamente por las columnas o variables enviadas en el
#' parámetro `nomb_cols`.
#' @return Un `data.frame` con los datos de una enfermedad
#' o evento agrupados por el nombre de la(s) columna(s) y el
#' número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_cols_casos(
#'   data_event = data_limpia,
#'   nomb_cols = "sexo",
#'   porcentaje = TRUE
#' )
#' agrupar_cols_casos(
#'   data_event = data_limpia,
#'   nomb_cols = c("sexo", "semana")
#' )
#' @export
agrupar_cols_casos <- function(data_event,
                               nomb_cols,
                               porcentaje = FALSE,
                               estandar = TRUE) {
  validar_data_event(data_event)
  validar_nomb_cols(data_event, nomb_cols)
  validar_porcentaje(porcentaje)
  if (estandar) {
    nomb_cols <- c(nomb_cols, c("cod_eve", "nombre_evento", "ano"))
    data_event_agrupada <- dplyr::group_by(
      data_event,
      dplyr::across(dplyr::all_of(nomb_cols))
    )
    data_event_agrupada <- dplyr::summarise(data_event_agrupada,
      casos = dplyr::n(),
      .groups = "drop"
    )
  } else {
    data_event_agrupada <- dplyr::group_by(
      data_event,
      dplyr::across(dplyr::all_of(nomb_cols))
    )
    data_event_agrupada <- dplyr::summarise(data_event_agrupada,
      casos = sum(.data[["casos"]]),
      .groups = "drop"
    )
  }
  if (porcentaje) {
    data_event_agrupada <-
      dplyr::mutate(data_event_agrupada,
        porcentaje =
          round(
            data_event_agrupada$casos
              / sum(data_event_agrupada$casos) * 100,
            2
          )
      )
  }
  return(data_event_agrupada)
}

#' @title Agrupar por rango de edad y casos
#' @description Función que agrupa los datos de una enfermedad o evento por
#' rango de edad y número de casos.
#' @param data_event Un `data.frame` que contiene los datos de la
#' enfermedad o evento.
#' @param col_edad Un `character` (cadena de caracteres) con
#' el nombre de la columna que contiene las edades en los datos de
#' la enfermedad o evento.
#' @param col_adicional Un `character` (cadena de caracteres) con
#' el nombre de la columna adicional para agrupar con las edades en
#' los datos de la enfermedad o evento; su valor por defecto
#' es `NULL`.
#' @param min_val Un `numeric` (numérico) que contiene la edad mínima
#' con la que debe iniciar el rango de edades.
#' @param max_val Un `numeric` (numérico) que contiene la edad máxima
#' con la que debe finalizar el rango de edades.
#' @param paso Un `numeric` (numérico) que contiene el valor del paso
#' para generar el rango de edades.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica si se debe
#' agregar una columna con el porcentaje de casos; su valor por
#' defecto es `TRUE`.
#' @return Un `data.frame` con los datos de la enfermedad o evento
#' agrupados por el rango de edad y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' data_edad <- agrupar_cols_casos(
#'   data_event = data_limpia,
#'   c("edad", "semana"),
#'   porcentaje = TRUE
#' )
#' agrupar_rango_edad(
#'   data_event = data_edad,
#'   col_edad = "edad",
#'   min_val = 0,
#'   max_val = max(data_edad$edad, na.rm = TRUE),
#'   paso = 10,
#'   porcentaje = TRUE
#' )
#' @export
agrupar_rango_edad <- function(data_event,
                               col_edad = "edad",
                               col_adicional = NULL,
                               min_val,
                               max_val,
                               paso,
                               porcentaje = TRUE) {
  validar_data_event(data_event)
  validar_edad(data_event, col_edad)
  total_casos <- sum(data_event$casos)
  data_vals_rango <-
    dplyr::mutate(data_event, ranges = cut(
      data_event[[col_edad]],
      seq(min_val, max_val, paso)
    ))
  data_vals_rango <- dplyr::group_by(
    data_vals_rango,
    dplyr::across(dplyr::all_of(c("ranges", col_adicional)))
  )
  data_vals_rango <- dplyr::summarize(data_vals_rango,
    casos = sum(.data$casos),
    .groups = "drop"
  )
  data_vals_rango <- as.data.frame(data_vals_rango)
  if (porcentaje) {
    data_vals_rango <-
      dplyr::mutate(data_vals_rango, porcentaje =
                      round(.data$casos / total_casos * 100, 3))
  }
  names(data_vals_rango)[names(data_vals_rango) == "ranges"] <- col_edad
  return(data_vals_rango)
}

#' @title Agrupar por fecha de inicio de síntomas y casos
#' @description Función que agrupa los datos de una enfermedad o evento por
#' fecha de inicio de síntomas y número de casos.
#' @param data_event Un `data.frame` que contiene los datos de
#' la enfermedad o evento.
#' @param col_fecha Un `character` (cadena de caracteres) con el
#' nombre de la columna de los datos de la enfermedad o evento que contiene
#' las fechas de inicio de síntomas; su valor por defecto es `"ini_sin"`.
#' @return Un `data.frame` con los datos de la enfermedad o evento
#' agrupados por fecha de inicio de síntomas y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_fecha_inisintomas(
#'   data_event = data_limpia,
#'   col_fecha = "ini_sin"
#' )
#' @export
agrupar_fecha_inisintomas <- function(data_event,
                                      col_fecha = "ini_sin") {
  fechas_cols_nombres <- obtener_val_config("dates_column_names")
  validar_data_event(data_event)
  if (is.null(col_fecha)) {
    col_fecha <- fechas_cols_nombres[3]
  }
  stopifnot(
    "El parametro col_fecha debe ser una cadena de caracteres" =
      is.character(col_fecha)
  )
  nomb_cols <- c(col_fecha, "semana")
  data_agrupada_fecha_ini <- agrupar_cols_casos(data_event,
    nomb_cols = nomb_cols
  )
  return(data_agrupada_fecha_ini)
}

#' @title Agrupar por sexo y casos
#' @description Función que agrupa los datos de una enfermedad o evento
#' por sexo y número de casos.
#' @param data_event Un `data.frame` que contiene los datos de la enfermedad
#' o evento.
#' @param col_sex Un `character` (cadena de caracteres) con el nombre
#' de la columna que contiene el sexo en los datos de la enfermedad o evento;
#' su valor por defecto es `"sexo"`.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica si se debe
#' agregar una columna con el porcentaje de casos; su valor por
#' defecto es `TRUE`.
#' @return Un `data.frame` con los datos de la enfermedad o evento
#' agrupados por sexo y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_sex(
#'   data_event = data_limpia,
#'   col_sex = "sexo",
#'   porcentaje = TRUE
#' )
#' @export
agrupar_sex <- function(data_event,
                        col_sex = "sexo",
                        porcentaje = TRUE) {
  validar_data_event(data_event)
  validar_sex(data_event, col_sex)
  validar_porcentaje(porcentaje)
  data_event_sex <- agrupar_cols_casos(data_event, col_sex, porcentaje)
  return(data_event_sex)
}

#' @title Agrupar por sexo, semana epidemiológica y casos
#' @description Función que agrupa los datos de enfermedades por sexo,
#' semana epidemiológica y número de casos.
#' @param data_event Un `data.frame` que contiene los datos de
#' la enfermedad o evento.
#' @param cols_sex Un `character` (cadena de caracteres) o
#' `array` (arreglo) de `character` con el nombre de la(s)
#' columna(s) que contienen el sexo y las semanas
#' epidemiológicas; su valor por defecto es `c("sexo", "semana")`.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica si se debe
#' agregar una columna con el porcentaje de casos; su valor por
#' defecto es `TRUE`.
#' @return Un `data.frame` con los datos de la enfermedad o evento
#' agrupados por sexo, semana epidemiológica y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_sex_semanaepi(
#'   data_event = data_limpia,
#'   cols_sex = c("sexo", "semana"),
#'   porcentaje = TRUE
#' )
#' @export
agrupar_sex_semanaepi <- function(data_event,
                                  cols_sex = c("sexo", "semana"),
                                  porcentaje = TRUE) {
  validar_data_event(data_event)
  stopifnot(
    "El parametro cols_sex debe ser una cadena de caracteres
            o un arreglo de cadenas de caracteres " =
      (is.character(cols_sex) && !is.array(cols_sex)) ||
        (!is.character(cols_sex) && is.array(cols_sex))
  )
  data_event_sex_semanaepi <- agrupar_cols_casos(
    data_event,
    cols_sex,
    porcentaje
  )
  return(data_event_sex_semanaepi)
}

#' @title Agrupar por edad y casos
#' @description Función que agrupa los datos de una enfermedad o evento por
#' edad y número de casos.
#' @param data_event Un `data.frame` que contiene los datos de la enfermedad
#' o evento.
#' @param col_edad Un `character` (cadena de caracteres) con el nombre
#' de la columna que contiene las edades en los datos de la enfermedad o
#' evento; su valor por defecto es `"edad"`.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica si se debe
#' agregar una columna con el porcentaje de casos; su valor por
#' defecto es `FALSE`.
#' @param interval_edad Un `numeric` (numérico) que contiene el intervalo del
#' rango de edades; su valor por defecto es `10`.
#' @return Un `data.frame` con los datos de la enfermedad o evento agrupados
#' por edad y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_edad(
#'   data_event = data_limpia,
#'   col_edad = "edad",
#'   porcentaje = FALSE
#' )
#' @export
agrupar_edad <- function(data_event,
                         col_edad = "edad",
                         interval_edad = 10,
                         porcentaje = FALSE) {
  validar_data_event(data_event)
  validar_edad(data_event, col_edad)
  validar_porcentaje(porcentaje)
  stopifnot(
    "El parametro interval_edad debe ser un numero" = is.numeric(interval_edad)
  )
  data_event_edad <- agrupar_cols_casos(
    data_event,
    col_edad
  )
  max_edad <- max(data_event_edad[[col_edad]],
                  na.rm = TRUE)
  min_edad <- min(data_event_edad[[col_edad]],
                  na.rm = TRUE)
  if (max_edad < interval_edad) {
    interval_edad <- max_edad / 3
  }
  if (interval_edad < min_edad) {
    interval_edad <- min_edad
  }
  data_event_edad <-
    agrupar_rango_edad(data_event_edad,
      col_edad = col_edad,
      min_val = 0,
      max_val = max_edad,
      paso = interval_edad,
      porcentaje = porcentaje
    )
  return(data_event_edad)
}

#' @title Agrupar por edades, sexo y casos
#' @description Función que agrupa los datos de una enfermedad o evento por
#' edades, sexo y número de casos.
#' @param data_event Un `data.frame` que contiene los datos de la enfermedad
#' o evento.
#' @param col_edad Un `character` (cadena de caracteres) con el nombre de la
#' columna que contiene las edades en los datos de la enfermedad o evento;
#' su valor por defecto es `"edad"`.
#' @param col_sex Un `character` (cadena de caracteres) con el nombre de la
#' columna que contiene el sexo en los datos de la enfermedad o evento;
#' su valor por defecto es `"sexo`.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica si se debe
#' agregar una columna con el porcentaje de casos; su valor por
#' defecto es `TRUE`.
#' @param interval_edad Un `numeric` (numérico) que contiene el intervalo del
#' rango de edades; su valor por defecto es `10`.
#' @return Un `data.frame` con los datos de enfermedades agrupados
#' por edades, sexo y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_edad_sex(
#'   data_event = data_limpia,
#'   col_edad = "edad",
#'   col_sex = "sexo",
#'   porcentaje = TRUE
#' )
#' @export
agrupar_edad_sex <- function(data_event,
                             col_edad = "edad",
                             col_sex = "sexo",
                             porcentaje = TRUE,
                             interval_edad = 10) {
  validar_data_event(data_event)
  validar_edad(data_event, col_edad)
  validar_sex(data_event, col_sex)
  validar_porcentaje(porcentaje)
  nomb_cols <- c(col_edad, col_sex)
  data_event_edad_sex <- agrupar_cols_casos(
    data_event,
    nomb_cols,
    porcentaje
  )
  max_edad <- max(data_event_edad_sex[[col_edad]],
                  na.rm = TRUE)
  min_edad <- min(data_event_edad_sex[[col_edad]],
                  na.rm = TRUE)
  if (max_edad < interval_edad) {
    interval_edad <- max_edad / 3
  }
  if (interval_edad < min_edad) {
    interval_edad <- min_edad
  }
  data_event_edad_sex <- agrupar_rango_edad(
    data_event_edad_sex,
    nomb_cols[1],
    nomb_cols[2],
    min_val = 0,
    max_val =
      max(data_event_edad_sex[[nomb_cols[1]]],
        na.rm = TRUE
      ),
    paso = interval_edad,
    porcentaje = porcentaje
  )
  return(data_event_edad_sex)
}

#' @title Agrupar por departamento y casos
#' @description Función que agrupa los datos por códigos de departamento y
#' número de casos.
#' @param data_event Un `data.frame` que contiene los datos de la
#' enfermedad o evento.
#' @param col_dpto Un `character` (cadena de caracteres) con el nombre
#' de la columna que contiene los códigos de los departamentos en los
#' datos de la enfermedad o evento; su valor por defecto es `"cod_dpto_o"`.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica si se debe
#' agregar una columna con el porcentaje de casos; su valor por
#' defecto es `FALSE`.
#' @return Un `data.frame` con los datos de la enfermedad o evento agrupados
#' por códigos de departamento y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_dpto(
#'   data_event = data_limpia,
#'   col_dpto = "cod_dpto_o",
#'   porcentaje = FALSE
#' )
#' @export
agrupar_dpto <- function(data_event,
                         col_dpto = "cod_dpto_o",
                         porcentaje = FALSE) {
  validar_data_event(data_event)
  stopifnot(
    "El parametro col_dpto debe ser una cadena de caracteres" =
      is.character(col_dpto),
    "El parametro porcentaje debe ser un booleano (TRUE o FALSE)" =
      is.logical(porcentaje)
  )
  data_event_cods_dpto <- data_event
  if (length(col_dpto) == 1) {
    nomb_cols <- obtener_tip_ocurren_geo(data_event_cods_dpto[["cod_eve"]][1])
    nomb_cols <- nomb_cols[1:2]
  } else {
    nomb_cols <- col_dpto
  }
  data_event_cods_dpto <- agrupar_cols_casos(data_event_cods_dpto,
    nomb_cols = nomb_cols,
    porcentaje = porcentaje
  )
  return(data_event_cods_dpto)
}

#' @title Agrupar por municipios y casos
#' @description Función que agrupa los datos de una enfermedad o evento por
#' código de municipios y número de casos.
#' @param data_event Un `data.frame` que contiene los datos de la
#' enfermedad o evento.
#' @param dpto Un `character` (cadena de caracteres) o `numeric` (numérico)
#' que contiene el nombre del departamento; su valor por defecto es `NULL`.
#' @param col_mpio Un `character` (cadena de caracteres) con el nombre de
#' la columna que contiene los códigos de los municipios en los datos de la
#' enfermedad o evento; su valor por defecto es `"cod_mun_o"`.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica si se debe
#' agregar una columna con el porcentaje de casos; su valor por
#' defecto es `FALSE`.
#' @return Un `data.frame` con los datos de la enfermedad o evento agrupados
#' por códigos de municipios y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_mpio(
#'   data_event = data_limpia,
#'   dpto = "ANTIOQUIA",
#'   col_mpio = "cod_mun_o",
#'   porcentaje = FALSE
#' )
#' agrupar_mpio(
#'   data_event = data_limpia,
#'   dpto = "05",
#'   col_mpio = "cod_mun_o",
#'   porcentaje = FALSE
#' )
#' agrupar_mpio(
#'   data_event = data_limpia,
#'   dpto = 05,
#'   col_mpio = "cod_mun_o",
#'   porcentaje = TRUE
#' )
#' @export
agrupar_mpio <- function(data_event,
                         dpto = NULL,
                         col_mpio = "cod_mun_o",
                         porcentaje = FALSE) {
  validar_data_event(data_event)
  stopifnot(
    "El parametro col_mpio debe ser una cadena de caracteres" =
      is.character(col_mpio),
    "El parametro porcentaje debe ser un booleano (TRUE o FALSE)" =
      is.logical(porcentaje)
  )
  cols_geo_ocurrencia <- data.frame()
  cod_events <- unique(data_event[["cod_eve"]])
  for (cod in cod_events) {
    cols_geo_ocurrencia <- c(
      cols_geo_ocurrencia,
      obtener_tip_ocurren_geo(cod)
    )
  }
  nomb_cols <- obtener_tip_ocurren_geo(data_event[["cod_eve"]][1])
  data_event_muns <- data_event
  if (!is.null(dpto)) {
    aux_dpto <- unique(data_event_muns[[nomb_cols[1]]])
    if (length(aux_dpto) > 1) {
      data_event_muns <- geo_filtro(data_event, dpto)
    }
  } else {
    dpto <- unique(data_event_muns[[nomb_cols[1]]])
    if (length(dpto) != 1) {
      stopifnot(
        "Debe ingresar el nombre o codigo del departamento" =
          length(dpto) == 1
      )
    }
  }
  dept_data <- obtener_info_depts(dpto)
  data_event_muns <- agrupar_cols_casos(data_event_muns,
    nomb_cols = nomb_cols[1:4],
    porcentaje = porcentaje
  )
  data_event_muns[[nomb_cols[1]]] <-
    as.character(data_event_muns[[nomb_cols[1]]])
  data_event_muns[[nomb_cols[3]]] <-
    as.character(data_event_muns[[nomb_cols[3]]])
  dept_data <- dept_data[1, ]
  data_event_muns <- dplyr::arrange(
    data_event_muns,
    dplyr::desc(.data$casos)
  )
  return(data_event_muns)
}

#' @title Agrupar por área geográfica
#' @description Función que agrupa los datos de una enfermedad o evento por
#' área geográfica.
#' @param data_event Un `data.frame` que contiene los datos de la
#' enfermedad o evento.
#' @param col_area Un `character` (cadena de caracteres) con el nombre de
#' la columna que contiene las áreas geográficas en los datos de la enfermedad
#' o evento; su valor por defecto es `"area"`.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica si se debe
#' agregar una columna con el porcentaje de casos; su valor por
#' defecto es `FALSE`.
#' @return Un `data.frame` con los datos de la enfermedad o evento agrupados
#' por área geográfica.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_area_geo(
#'   data_event = data_limpia,
#'   col_area = "area",
#'   porcentaje = FALSE
#' )
#' @export
agrupar_area_geo <- function(data_event,
                             col_area = "area",
                             porcentaje = FALSE) {
  validar_data_event(data_event)
  validar_area_geo(data_event, col_area)
  validar_porcentaje(porcentaje)
  data_event_area <- agrupar_cols_casos(
    data_event,
    col_area
  )
  data_event_area <- dplyr::arrange(
    data_event_area,
    dplyr::desc(.data$casos)
  )
  return(data_event_area)
}

#' @title Agrupar por área geográfica a nivel departamental o municipal
#' @description Función que agrupa los datos de una enfermedad o evento por
#' área geográfica a nivel departamental o municipal.
#' @param data_event Un `data.frame` que contiene los datos de la
#' enfermedad o evento.
#' @param dpto Un `character` (cadena de caracteres) que contiene
#' el nombre del departamento; su valor por defecto es `NULL`. Si se ingresa
#' un valor en este parámetro se procederá agrupar los datos por los
#' municipios del departamento y sus áreas geográficas. Si no se
#' ingresa un valor en este parámetro validará si los datos ya están
#' filtrados por algún departamento; si no lo están generará la agrupación
#' por departamento.
#' @param col_area Un `character` (cadena de caracteres) con el nombre de
#' la columna que contiene las áreas geográficas en los datos de la enfermedad
#' o evento; su valor por defecto es `"cod_mun_o"`.
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica si se debe
#' agregar una columna con el porcentaje de casos; su valor por
#' defecto es `FALSE`.
#' @param top Un `numeric` (numérico) que indica la cantidad de departamentos o
#' municipios con mayor número de casos que se deben retornar; su valor
#' por defecto es `10`.
#' @return Un `data.frame` con el top 10 de los datos de la enfermedad o evento
#' agrupados por áreas geográficas y número de casos.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_top_area_geo(
#'   data_event = data_limpia,
#'   dpto = "Antioquia",
#'   col_area = "area",
#'   porcentaje = FALSE,
#'   top = 10
#' )
#' @export
agrupar_top_area_geo <- function(data_event,
                                 dpto = NULL,
                                 col_area = "area",
                                 porcentaje = FALSE,
                                 top = 10) {
  validar_data_event(data_event)
  validar_area_geo(data_event, col_area)
  validar_porcentaje(porcentaje)
  nomb_cols <- c(
    col_area,
    obtener_tip_ocurren_geo(data_event[["cod_eve"]][1])[1:4]
  )
  data_event_area <- data_event
  if (!is.null(dpto)) {
    aux_dpto <- unique(data_event_area[[nomb_cols[2]]])
    if (length(aux_dpto) > 1) {
      data_event_area <- geo_filtro(data_event, dpto)
    }
  } else {
    dpto <- unique(data_event_area[[nomb_cols[3]]])
    if (length(dpto) != 1) {
      nomb_cols <- nomb_cols[1:3]
    }
  }
  data_event_area <- agrupar_cols_casos(
    data_event_area,
    nomb_cols
  )
  data_event_area <- dplyr::arrange(
    data_event_area,
    dplyr::desc(.data$casos)
  )
  if (top <= nrow(data_event_area)) {
    data_event_area <- data_event_area[1:top, ]
  }
  return(data_event_area)
}

#' @title Agrupar por tipo de enfermedad o evento
#' @description Función que agrupa los casos por tipo de enfermedad o evento.
#' @param data_event Un `data.frame` que contiene los datos de la
#' enfermedad o evento.
#' @param col_event Un `character` (cadena de caracteres) con el nombre de
#' la columna que contiene los códigos de los eventos o de las enfermedades
#' en los datos; su valor por defecto es `"cod_eve"`.
#' @return Un `data.frame` con los datos de la enfermedad o evento agrupados
#' por tipo.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_eventos(
#'   data_event = data_limpia,
#'   col_event = "cod_eve"
#' )
#' @export
agrupar_eventos <- function(data_event, col_event = "cod_eve") {
  validar_data_event(data_event)
  stopifnot(
    "El parametro col_event debe ser una cadena de caracteres" =
      is.character(col_event)
  )
  data_event_tipos <- agrupar_cols_casos(data_event, nomb_cols = col_event)
  return(data_event_tipos)
}

#' @title Agrupar por años de una enfermedad o evento
#' @description Función que agrupa los casos por los años de una enfermedad
#' o evento.
#' @param data_event Un `data.frame` que contiene los datos de la
#' enfermedad o evento.
#' @param col_year Un `character` (cadena de caracteres) con el nombre de
#' la columna que contiene los años en los datos de la enfermedad o evento;
#' su valor por defecto es `"ano"`.
#' @return Un `data.frame` con los datos de la enfermedad o evento agrupados
#' por año.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_years(
#'   data_event = data_limpia,
#'   col_year = "ano"
#' )
#' @export
agrupar_years <- function(data_event, col_year = "ano") {
  validar_data_event(data_event)
  validar_years(data_event, col_year)
  data_event_year <- agrupar_cols_casos(data_event,
    nomb_cols = c(
      col_year,
      "cod_eve"
    )
  )
  return(data_event_year)
}

#' @title Agrupar por la clasificación inicial del caso
#' @description Función que agrupa los casos por la clasificación inicial
#' del caso.
#' @param data_event Un `data.frame` que contiene los datos de la
#' enfermedad o evento.
#' @param cols_tipo Un `character` (cadena de caracteres) o `array` (arreglo)
#' de `character` con el nombre de las columna(s) que contiene la clasificación
#' inicial del caso en los datos de la enfermedad o evento; su valor por
#' defecto es `"tip_cas"`.
#' @return Un `data.frame` con los datos de la enfermedad o evento agrupados
#' por la clasificación inicial del caso y/u otras variables como los años.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_tipo_caso(
#'   data_event = data_limpia,
#'   cols_tipo = "tip_cas"
#' )
#' @export
agrupar_tipo_caso <- function(data_event, cols_tipo = "tip_cas") {
  validar_data_event(data_event)
  stopifnot(
    "El parametro cols_tipo debe ser una cadena de caracteres" =
      is.character(cols_tipo)
  )
  if (length(cols_tipo) == 1) {
    cols_tipo <- c(cols_tipo, "cod_eve")
  }
  etiquetas <- obtener_val_config("labels_cas_tip")
  etiquetas <- as.character(etiquetas)
  data_event_tipo <- agrupar_cols_casos(data_event,
    nomb_cols = cols_tipo
  )
  data_event_tipo <-
    dplyr::mutate(data_event_tipo,
      nombre_tip_cas =
        etiquetas[as.numeric(data_event_tipo[[cols_tipo[1]]])]
    )
  return(data_event_tipo)
}

#' @title Agrupar por la pertenencia étnica
#' @description Función que agrupa los casos por la pertenencia étnica.
#' @param data_event Un `data.frame` que contiene los datos de la
#' enfermedad o evento.
#' @param cols_etn Un `character` (cadena de caracteres) o un `array` de
#' `character` con el nombre de la(s) columna(s) que contiene(n) la
#' pertenencia étnica en los datos de la enfermedad o evento;
#' su valor por defecto es `"per_etn"`
#' @param porcentaje Un `logical` (TRUE o FALSE) que indica
#' si se debe agregar una columna con el porcentaje de casos;
#' su valor por defecto es `TRUE`.
#' @return Un `data.frame` con los datos de la enfermedad o evento agrupados
#' por la pertenencia étnica.
#' @examples
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' agrupar_per_etn(
#'   data_event = data_limpia,
#'   cols_etn = "per_etn"
#' )
#' @export
agrupar_per_etn <- function(data_event, cols_etn = "per_etn",
                            porcentaje = TRUE) {
  validar_data_event(data_event)
  validar_per_etn(data_event, cols_etn)
  validar_porcentaje(porcentaje)
  if (length(cols_etn) == 1) {
    cols_etn <- c(cols_etn, "cod_eve")
  }
  etiquetas <- obtener_val_config("labels_per_etn")
  etiquetas <- unlist(etiquetas)
  data_event_tipo <- agrupar_cols_casos(data_event,
    nomb_cols = cols_etn,
    porcentaje = porcentaje
  )
  data_event_tipo <-
    dplyr::mutate(data_event_tipo,
      nombre_per_etn =
        unname(etiquetas[
          as.character(data_event_tipo[[cols_etn[1]]])
        ])
    )
  return(data_event_tipo)
}

#' @title Calcular incidencia
#' @description Función que calcula la incidencia de una enfermedad o evento
#' para todo Colombia, un departamento o un municipio.
#' @param data_incidencia Un `data.frame` que contiene la población a riesgo o
#' las proyecciones poblaciones DANE. Si este parámetro está vacío, se importará
#' la población a riesgo o las proyecciones, dependiendo de la disponibilidad de
#' la información; su valor por defecto es `NULL`.
#' @param ruta_dir Un `character` (cadena de caracteres) que especifica la ruta
#' del directorio donde se almacenarán la población a riesgo o las proyecciones
#' poblacionales DANE. Su valor por defecto es `NULL`.
#' @param cache Un `logical` (`TRUE` o `FALSE`) que indica si la población a
#' riesgo o las proyecciones poblacionales DANE descargadas deben ser
#' almacenados en caché. Su valor por defecto es `FALSE`.
#' @param data_agrupada Un `data.frame` que contiene los datos de la enfermedad
#' agrupados por departamento o municipio y número de casos.
#' @param poblacion Un `character` (cadena de caracteres) con el tipo de
#' población para calcular la incidencia. Puede ser `"riesgo"` para la población
#' a riesgo o `"proyecciones"` para las proyecciones poblacionales DANE;
#' su valor por defecto es `NULL`.
#' @param year Un `numeric` (numérico) con el año que se debe tomar en la
#' población a riesgo o en las proyecciones poblacionales DANE; su valor por
#' defecto es `NULL`.
#' @param dpto Un `character` (cadena de caracteres) o `numeric` (numérico)
#' que contiene el código o nombre del departamento; su valor por
#' defecto es `NULL`.
#' @param mpio Un `character` (cadena de caracteres) o `numeric` (numérico)
#' que contiene el código o nombre del municipio; su valor por defecto
#' es `NULL`.
#' @param sex Un `character` (cadena de caracteres) que especifica el
#' sexo: `"F"` para Femenino y `"M"` para Masculino; su valor por defecto
#' es `NULL`.
#' @return Un `numeric` con el cálculo de la incidencia para todo Colombia, un
#' departamento, municipio o sexo especifico.
#' @examples
#' \donttest{
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' # Cálculo de la incidencia con proyecciones poblacionales por departamento
#' data_agrupada_mpios <- agrupar_mpio(data_limpia, dpto = "Antioquia")
#' if (interactive()) {
#'   calcular_incidencia(
#'     data_agrupada = data_agrupada_mpios,
#'     poblacion = "proyecciones",
#'     dpto = "05",
#'     year = 2020,
#'     cache = TRUE
#'   )
#' }
#' # Cálculo de la incidencia con proyecciones poblacionales por municipio
#' calcular_incidencia(
#'   data_agrupada = data_agrupada_mpios,
#'   poblacion = "proyecciones",
#'   dpto = "Antioquia",
#'   mpio = "05001",
#'   year = 2020,
#'   ruta_dir = tempdir()
#' )
#' # Cálculo de la incidencia con población a riesgo para Colombia
#' data_agrupada_dptos <- agrupar_dpto(data_limpia)
#' calcular_incidencia(
#'   poblacion = "riesgo",
#'   data_agrupada = data_agrupada_dptos,
#'   year = 2020,
#'   ruta_dir = tempdir()
#' )
#' }
#' @export
calcular_incidencia <- function(data_incidencia = NULL,
                                cache = FALSE, ruta_dir = NULL,
                                data_agrupada, poblacion = NULL,
                                year = NULL, dpto = NULL,
                                mpio = NULL, sex = NULL) {
  validar_data_agrupada(data_agrupada)
  nombre_evento <- data_agrupada$nombre_evento[1]
  vals_event <-
  obtener_cond_inciden_event(cod_eve = data_agrupada[["cod_eve"]][1])
  coeficiente <- as.integer(vals_event$coeficiente)
  if (is.null(year)) {
    year <- as.numeric(obtener_year(data_agrupada))
  }
  if (is.null(poblacion)) {
    poblacion <- vals_event$denominador
  }
  pop_incidencia <-
    obtener_pob_incidencia(
      data_incidencia = data_incidencia,
      poblacion = poblacion,
      event = nombre_evento,
      year = year,
      ruta_dir = ruta_dir,
      cache = cache
    )
  data_incidencia <- pop_incidencia$data_incidencia
  poblacion <- pop_incidencia$poblacion
  poblacion_incidencia <- data_incidencia
  total_poblacion <- NULL
  incidencia <- 0.00
  nomb_cols <- obtener_tip_ocurren_geo(data_agrupada[["cod_eve"]][1])
  unidades_geo <- obtener_dpto_mpio(
    data_agrupada = data_agrupada,
    nomb_cols = nomb_cols,
    dpto = dpto, mpio = mpio
  )
  dpto <- unidades_geo$dpto
  mpio <- unidades_geo$mpio
  if (!is.null(dpto)) {
    if (poblacion == "proyecciones") {
      poblacion_incidencia <-
        dplyr::filter(
          poblacion_incidencia,
          .data$area_geografica == "Total",
          .data$dp == dpto, .data$ano == year
        )
    } else {
      poblacion_incidencia <- dplyr::filter(
        data_incidencia,
        .data$cod_dpto == dpto
      )
      total_poblacion <-
        sum(poblacion_incidencia[[paste0("poblacion_riesgo_", year)]])
    }
    if (!is.null(mpio)) {
      if (poblacion == "proyecciones") {
        poblacion_incidencia <-
          poblacion_incidencia[poblacion_incidencia$mpio == mpio, ]
      } else {
        poblacion_incidencia <-
          poblacion_incidencia[poblacion_incidencia$cod_mpio == mpio, ]
        total_poblacion <-
          sum(poblacion_incidencia[[paste0("poblacion_riesgo_", year)]])
      }
      if (is.null(sex)) {
        data_agrupada <- data_agrupada[data_agrupada[[nomb_cols[3]]] == mpio, ]
      }
    } else if (is.null(sex)) {
      data_agrupada <- data_agrupada[data_agrupada[[nomb_cols[1]]] == dpto, ]
    }
  } else {
    if (poblacion == "proyecciones") {
      poblacion_incidencia <-
        dplyr::filter(
          data_incidencia,
          .data$area_geografica == "Total",
          .data$ano == year
        )
    } else {
      total_poblacion <-
        sum(poblacion_incidencia[[paste0("poblacion_riesgo_", year)]])
    }
  }
  if (!is.null(sex)) {
    if (sex == "F") {
      total_poblacion <- sum(poblacion_incidencia$mujeres)
    } else {
      total_poblacion <- sum(poblacion_incidencia$hombres)
    }
  } else if (poblacion == "proyecciones") {
    total_poblacion <- sum(poblacion_incidencia$total)
  }
  total_casos <- sum(data_agrupada$casos)
  if (total_poblacion > 0) {
    incidencia <- round(
      (total_casos / total_poblacion) *
        coeficiente,
      2
    )
  }
  pop_incidencia_total <- list(
    incidencia = incidencia,
    poblacion = poblacion
  )
  return(pop_incidencia_total)
}

#' @title Calcular incidencia según distribución geográfica
#' @description Función que calcula la incidencia de una enfermedad o evento
#' para todos los departamentos de Colombia o los municipios de un departamento.
#' @param data_incidencia Un `data.frame` que contiene las proyecciones
#' poblacionales del DANE; su valor por defecto es `NULL`.
#' @param ruta_dir Un `character` (cadena de caracteres) que especifica la ruta
#' del directorio donde se almacenarán la población a riesgo o las proyecciones
#' poblacionales DANE. Su valor por defecto es `NULL`.
#' @param cache Un `logical` (`TRUE` o `FALSE`) que indica si la población a
#' riesgo o las proyecciones poblacionales DANE descargadas deben ser
#' almacenados en caché. Su valor por defecto es `FALSE`.
#' @param data_agrupada Un `data.frame` que contiene los datos de la enfermedad
#' agrupados por departamento o municipio y número de casos.
#' @param poblacion Un `character` (cadena de caracteres) con el tipo de
#' población para calcular la incidencia. Puede ser `"riesgo"` para la población
#' a riesgo o `"proyecciones"` para las proyecciones poblacionales DANE;
#' su valor por defecto es `NULL`.
#' @param year Un `numeric` (numérico) con el año que se debe tomar en la
#' población a riesgo o en las proyecciones poblacionales DANE; su valor por
#' defecto es `NULL`.
#' @return Un `data.frame` con el cálculo de la incidencia para todos los
#' departamentos de Colombia o los municipios de un departamento.
#' @examples
#' \donttest{
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' data_agrupada_mpios <- agrupar_mpio(data_limpia, dpto = "Antioquia")
#' # Cálculo de la incidencia con población a riesgo por departamento
#' if (interactive()) {
#'   calcular_incidencia_geo(
#'     poblacion = "riesgo",
#'     data_agrupada = data_agrupada_mpios,
#'     year = 2020,
#'     cache = TRUE
#'   )
#' }
#' data_agrupada_dptos <- agrupar_dpto(data_limpia)
#' # Cálculo de la incidencia con proyecciones poblacionales para Colombia
#' calcular_incidencia_geo(
#'   poblacion = "proyecciones",
#'   data_agrupada = data_agrupada_dptos,
#'   year = 2020,
#'   ruta_dir = tempdir()
#' )
#' }
#' @export
calcular_incidencia_geo <- function(data_incidencia = NULL,
                                    cache = FALSE,
                                    ruta_dir = NULL,
                                    data_agrupada,
                                    poblacion = NULL,
                                    year = NULL) {
  validar_data_agrupada(data_agrupada)
  data_geo_incidencia <- NULL
  nombre_evento <- data_agrupada[["nombre_evento"]][1]
  cod_evento <- data_agrupada[["cod_eve"]][1]
  if (is.null(year)) {
    year <- as.numeric(obtener_year(data_agrupada))
  }
  if (is.null(poblacion)) {
    vals_event <-
      obtener_cond_inciden_event(cod_eve = cod_evento)
    poblacion <- vals_event$denominador
  }
  pop_incidencia <-
    obtener_pob_incidencia(
      data_incidencia = data_incidencia,
      poblacion = poblacion,
      event = nombre_evento,
      year = year,
      cache = cache,
      ruta_dir = ruta_dir
    )
  data_incidencia <- pop_incidencia$data_incidencia
  poblacion <- pop_incidencia$poblacion
  nomb_cols <- obtener_tip_ocurren_geo(cod_evento)
  if (nomb_cols[1] %in% colnames(data_agrupada) &&
    !(nomb_cols[3] %in% colnames(data_agrupada))) {
    data_agrupada <- dplyr::group_by(
      data_agrupada,
      dplyr::across(dplyr::all_of(nomb_cols[1:2]))
    )
    data_agrupada <- dplyr::summarise(data_agrupada,
      casos =
        sum(.data[["casos"]]),
      .groups = "drop"
    )
    data_agrupada$nombre_evento <- nombre_evento
    data_agrupada$cod_eve <- cod_evento

    geo_incidencia <- rep_len(NA_real_, nrow(data_agrupada))
    for (fila in seq_along(geo_incidencia)) {
      dpto_fila <- data_agrupada[fila, ]
      incidencia <- calcular_incidencia(
        data_incidencia = data_incidencia,
        data_agrupada = dpto_fila,
        poblacion = poblacion,
        dpto = dpto_fila[[nomb_cols[1]]],
        year = year,
        cache = cache,
        ruta_dir = ruta_dir
      )
      geo_incidencia[fila] <- incidencia$incidencia
    }
    data_geo_incidencia <- cbind(data_agrupada,
      incidencia = geo_incidencia
    )
  } else if (nomb_cols[3] %in% colnames(data_agrupada)) {
    data_agrupada <- dplyr::group_by(
      data_agrupada,
      dplyr::across(dplyr::all_of(nomb_cols[1:4]))
    )
    data_agrupada <- dplyr::summarise(data_agrupada,
      casos =
        sum(.data[["casos"]]),
      .groups = "drop"
    )
    data_agrupada$nombre_evento <- nombre_evento
    data_agrupada$cod_eve <- cod_evento
    geo_incidencia <- rep_len(NA_real_, nrow(data_agrupada))
    for (fila in seq_along(geo_incidencia)) {
      mpio_fila <- data_agrupada[fila, ]
      incidencia <- calcular_incidencia(
        data_incidencia = data_incidencia,
        data_agrupada = mpio_fila,
        poblacion = poblacion,
        dpto = mpio_fila[[nomb_cols[1]]],
        mpio = mpio_fila[[nomb_cols[3]]],
        year = year,
        cache = cache,
        ruta_dir = ruta_dir
      )
      geo_incidencia[fila] <- incidencia$incidencia
    }
    data_geo_incidencia <- cbind(data_agrupada,
      incidencia = geo_incidencia
    )
  }
  pop_data_incidencia <- list(
    data_incidencia = data_geo_incidencia,
    poblacion = poblacion
  )
  return(pop_data_incidencia)
}

#' @title Calcular incidencia por sexo
#' @description Función que calcula la incidencia de una enfermedad o evento
#' para todos los departamentos de Colombia o los municipios de un departamento
#' por cada sexo.
#' @param data_incidencia Un `data.frame` que contiene las proyecciones
#' poblacionales del DANE; su valor por defecto es `NULL`.
#' @param ruta_dir Un `character` (cadena de caracteres) que especifica la ruta
#' del directorio donde se almacenarán la población a riesgo o las proyecciones
#' poblacionales DANE. Su valor por defecto es `NULL`.
#' @param cache Un `logical` (`TRUE` o `FALSE`) que indica si la población a
#' riesgo o las proyecciones poblacionales DANE descargadas deben ser
#' almacenados en caché. Su valor por defecto es `FALSE`.
#' @param data_agrupada Un `data.frame` que contiene los datos de la enfermedad
#' agrupados por departamento o municipio y número de casos.
#' @param year Un `numeric` (numérico) con el año que se debe tomar en la
#' población a riesgo o en las proyecciones poblacionales DANE; su valor por
#' defecto es `NULL`.
#' @param dpto Un `character` (cadena de caracteres) o `numeric` (numérico)
#' que contiene el código o nombre del departamento; su valor por
#' defecto es `NULL`.
#' @param mpio Un `character` (cadena de caracteres) o `numeric` (numérico)
#' que contiene el código o nombre del municipio; su valor por defecto
#' es `NULL`.
#' @return Un `data.frame` con el cálculo de la incidencia para todos los
#' departamentos de Colombia o los municipios de un departamento por sexo.
#' @examples
#' \donttest{
#' data(dengue2020)
#' data_limpia <- limpiar_data_sivigila(data_event = dengue2020)
#' # Cálculo de la incidencia con proyecciones poblacionales por sexo y
#' # departamento
#' data_filtrada <- geo_filtro(
#'   data_event = data_limpia,
#'   dpto = "05"
#' )
#' data_agrupada <- agrupar_sex(data_filtrada)
#' if (interactive()) {
#'   calcular_incidencia_sex(
#'     data_agrupada = data_agrupada,
#'     dpto = "05",
#'     year = 2020,
#'     cache = TRUE
#'   )
#' }
#' #' Cálculo de la incidencia con proyecciones poblacionales por sexo y
#' # municipio
#' data_filtrada <- geo_filtro(
#'   data_event = data_limpia,
#'   dpto = "05",
#'   mpio = "Medellin"
#' )
#' calcular_incidencia_sex(
#'   data_agrupada = data_agrupada,
#'   dpto = "05",
#'   mpio = "Medellin",
#'   ruta_dir = tempdir()
#' )
#' }
#' @export
calcular_incidencia_sex <- function(data_incidencia = NULL,
                                    ruta_dir = NULL,
                                    cache = FALSE,
                                    data_agrupada,
                                    year = NULL, dpto = NULL,
                                    mpio = NULL) {
  validar_data_agrupada(data_agrupada)
  dept_data <- NULL
  nombre_evento <- data_agrupada$nombre_evento[1]
  if (is.null(year)) {
    year <- as.numeric(obtener_year(data_agrupada))
  }
  if (is.null(data_incidencia)) {
    data_incidencia <-
      import_pob_incidencia(poblacion = "proyecciones", year = year,
                            cache = cache, ruta_dir = ruta_dir)
    message(
      "Las incidencias se calcularon con las proyecciones ",
      "poblacionales DANE. Si usted cuenta con la poblacion ",
      "a riesgo definida por el Ministerio de Salud para el ",
      year, " puede hacer uso de ella, asignandola en el ",
      "argumento data_incidencia de la funcion"
    )
  } else {
    validar_data_incidencia(data_incidencia)
  }
  if (!is.null(dpto)) {
    stopifnot(
      "El parametro dpto debe ser una cadena de caracteres
               o numerico" =
        (is.numeric(dpto) && !is.character(dpto)) ||
          (!is.numeric(dpto) && is.character(dpto))
    )
    dept_data <- obtener_info_depts(dpto, mpio)
    stopifnot(
      "El departamento o municipio ingresado no existe" =
        seq_len(nrow(dept_data)) > 0
    )
    dept_data <- dept_data[1, ]
    dpto <- dept_data$codigo_departamento
    if (!is.null(mpio)) {
      mpio <- dept_data$codigo_municipio
    }
  }
  cod_eve <- data_agrupada$cod_eve[1]
  data_agrupada <- dplyr::group_by(
    data_agrupada,
    .data$sexo
  )
  data_agrupada <- dplyr::summarise(data_agrupada,
    casos = sum(.data[["casos"]]),
    .groups = "drop"
  )
  data_agrupada$cod_eve <- cod_eve
  data_agrupada$nombre_evento <- nombre_evento
  incidencia <- rep_len(NA_real_, nrow(data_agrupada))
  for (fila in seq_along(incidencia)) {
    sex_fila <- data_agrupada[fila, ]
    incidencia_sex <- calcular_incidencia(
      data_incidencia = data_incidencia,
      data_agrupada = sex_fila,
      poblacion = "proyecciones",
      dpto = dpto,
      mpio = mpio,
      sex = sex_fila[["sexo"]],
      year = year,
      cache = cache,
      ruta_dir = ruta_dir
    )
    incidencia[fila] <- incidencia_sex$incidencia
  }
  data_incidencia_sex <- cbind(data_agrupada, incidencia)
  if (!is.null(dpto) && is.null(data_incidencia_sex)) {
    data_incidencia_sex$nombre_departamento <- dept_data$nombre_departamento[1]
    data_incidencia_sex$codigo_departamento <- dpto
    if (!is.null(mpio)) {
      data_incidencia_sex$nombre_municipio <- dept_data$nombre_municipio[1]
      data_incidencia_sex$codigo_municipio <- mpio
    }
  }
  pop_data_incidencia <- list(
    data_incidencia = data_incidencia_sex,
    poblacion = "proyecciones"
  )
  return(pop_data_incidencia)
}

Try the sivirep package in your browser

Any scripts or data that you put into this service are public.

sivirep documentation built on April 4, 2025, 5 a.m.