R/summarize_change.R

Defines functions round_percent_columns add_unit format_summary_names category_value sum_categories summarize_change

#' @examples
#' data <- prep_raw(valid, valid[8, ])
#' summarize_change(data)
#' @noRd
summarize_change <- function(data) {
  real_change <- sum_categories(data, real_categories())
  virtual_change <- sum_categories(data, virtual_categories())
  total_change <- sum_categories(data, useful_categories())
  real_percent <- abs(100 * real_change / total_change)
  virtual_percent <- abs(100 * virtual_change / total_change)

  tibble::tibble(
    total_change, real_change, real_percent, virtual_change, virtual_percent
  )
}

sum_categories <- function(data, categories) {
  data %>%
    filter(.data$category %in% categories) %>%
    pull(.data$value) %>%
    sum(na.rm = TRUE)
}

category_value <- function(data, category) {
  filter(data, .data$category == .env$category)$value
}

#' @examples
#' x <- c("real", "virtual")
#' nms <- c(
#'   "total_change",
#'   paste0("percent_", x),
#'   paste0(x, "_change")
#' )
#'
#' sector <- "Power"
#'
#' nms
#' format_summary_names(nms, sector)
#' @noRd
format_summary_names <- function(nms, sector) {
  # TODO: pass sector and technology to provide appropriate units
  nms <- gsub("_", " ", nms)
  nms <- tools::toTitleCase(nms)
  # styler: off
  nms <- case_when(
    grepl("Percent", nms) ~ add_unit(nms, "%"),
    grepl("Change", nms) & sector == "Power" ~ add_unit(nms, "GW"),
    grepl("Change", nms) & sector == "Coal" ~ add_unit(nms, "tonnes"),
    grepl("Change", nms) & sector == "Oil&Gas" ~ add_unit(nms, "GJ"),
    TRUE ~ nms
  )
  # styler: on
  nms <- gsub("Change ", "", nms)
  nms <- gsub("Percent ", "", nms)
  nms
}

#' @examples
#' x <- c("foo", "bar")
#' add_unit(x, "%")
#' add_unit(x, "GW")
#' @noRd
add_unit <- function(x, unit) {
  sprintf("%s (%s)", x, unit)
}

round_percent_columns <- function(data) {
  mutate(data, across(matches("percent"), ~ as.integer(round(.x))))
}
2DegreesInvesting/tacApp documentation built on April 26, 2024, 4:39 p.m.