R/agg_regions.R

#' Aggregate CT regions according to the mapping table
#' 
#' @param data normalized trade data frame
#' @param RegionType type of the region form the mapping tabel
#' @param mt Path to the mapping table
#' @param intraExtraOnly return only intra- and extra-regional trade
#' @param onlyAggregates return aonly ggregates or also source data
agg_regions <- function(data,
                        RegionsType = "Income",
                        mt = system.file("extdata", str_c(mtType, "_regions.csv"), package = "tradeAnalysis"),
                        mtType = "ct",
                        dropCols = NULL,
                        valCol = "Value",
                        intraExtraOnly = TRUE,
                        onlyAggregates = TRUE) {
  
  
  # All available names
  nonAggName <- c("Reporter", "Partner", "areacode", "areaname", "Classification", drop)
  dataGroupName <- names(data)[!names(data) %in% c(nonAggName, valCol)]
  dropName <- names(data)[names(data) %in% nonAggName]
  if(length(dropName) != 0) {
    message(str_c("Variables ", str_c(dropName, collapse = ", ")," are dropped during aggregation.") )
  }
  
  # Maping table
  regionsMT <-
    read.csv(mt, stringsAsFactors = FALSE) %>% 
    tbl_df() %>% 
    select(Code, contains(RegionsType, ignore.case = TRUE), -contains("source"))
  names(regionsMT)[2] <- "Region"
  
  # Calculating intraand extra regional trade trade
  dataPreAgg <- 
    data %>% 
    left_join(regionsMT, by = c("Reporter.Code" = "Code")) 
  dataAgg <- 
    dataPreAgg %>% 
    select(-Reporter.Code) %>% 
    rename(Reporter.Code = Region) %>% 
    left_join(regionsMT, by = c("Partner.Code" = "Code")) %>% 
    select(-Partner.Code) %>% 
    rename(Partner.Code = Region) %>% 
    group_by_(.dots = dataGroupName) %>% 
    summarise_(.dots = setNames(list(lazyeval::interp(~ sum(.x), .x = as.name(valCol))), valCol)) %>% 
    # summarise(Value = sum(Value)) %>% 
    ungroup() %>% 
    mutate(Region = RegionsType)
  
  if (intraExtraOnly) {
    dataAgg <-
      dataAgg %>% 
      mutate(Partner.Code = ifelse(Reporter.Code == Partner.Code, "Intra-region trade", Partner.Code),
             Partner.Code = ifelse(!Partner.Code %in% c("0", "World", "Intra-region trade"), "Extra-region trade", Partner.Code)) %>% 
      group_by_(.dots = dataGroupName) %>% 
      summarise_(.dots = setNames(list(lazyeval::interp(~ sum(.x), .x = as.name(valCol))), valCol))  %>% 
      # summarise(Value = sum(Value)) %>% 
      ungroup() %>% 
      mutate(Region = RegionsType)
  }
  
  if(!onlyAggregates) {
    dataAgg <- 
      dataPreAgg %>% 
      mutate(Reporter.Code = as.character(Reporter.Code),
             Partner.Code = as.character(Partner.Code)) %>% 
      bind_rows(dataAgg)
  }
  
  return(dataAgg)
}
EBukin/tradeAnalysis-pack documentation built on May 23, 2019, 8:25 p.m.