R/order_label.R

Defines functions arrange_by_factor num_fmt_orderlabel group_last_fun label_last_fun none_other_fun stacked_chart_ms stacked_chart horizontal_chart ordering_top2 spreading_top2 topbox_fun grouped_unordered4 grouped_unordered3 grouped_unordered2 grouped_unordered1 section_grouped_unordered grouped_ordered4 grouped_ordered3 grouped_ordered2 grouped_ordered1 section_grouped_ordered grouped_specific8 grouped_specific7 grouped_specific6 grouped_specific5 section_grouped_specifics_nolab grouped_specific4 grouped_specific3 grouped_specific2 grouped_specific1 section_grouped_specifics reverse_label_unordered2 reverse_group ungrouped5 ungrouped4 ungrouped3 ungrouped2 ungrouped1 section_ungrouped reverse_label_unordered reverse_label factors add_group add_label blank_values order_label

Documented in order_label

# Executive function ----------------------------------------------------------
#' Order your data and add percent labels
#'
#' Takes a dataframe (frequencies) and orders the labels and groups while adding percent labels for use in ggplot
#' @param dataset The name of the data frame for the function to modify, usually piped in after running freqs
#' @param label_var DEFAULT = label; name of variable to be ordered
#' @param group_var DEFAULT = 'NULL'; Add the unquoted name of the grouping variable if your data is grouped
#' @param inherent_order_label DEFAULT = FALSE; If FALSE, puts labels in descending order. If TRUE, puts labels in the inherent order from survey (e.g., Strongly agree to strongly disagree). Specifying stacked = 'gg' or 'ms' automatically makes inherent_order_label = TRUE
#' @param inherent_order_group DEFAULT = FALSE; If FALSE, puts groups in descending order. If TRUE, puts groups in the order they are factored (e.g., District 1, District 2...)
#' @param label_first DEFAULT = NA; If specified, puts the specified label first. ex: 'brand1' would put label called brand1 before all other labels
#' @param group_first DEFAULT = NA; If specified, puts the specified group first. ex: 'brand1' would put group called brand1 before all other groups
#' @param rev_label DEFAULT = FALSE; To reverse the order of labels in a chart, use rev_label = TRUE
#' @param rev_group DEFAULT = FALSE; To reverse the order of groups in a chart, use rev_group = TRUE
#' @param label_last DEFAULT = NA; If specified, puts the specified label last ex: 'brand1' would put label called brand1 after all other labels
#' @param group_last DEFAULT = NA; If specified, puts the specified group last ex: 'brand1' would put group called brand1 after all other groups
#' @param horizontal DEFAULT = FALSE; For horizontal charts (grouped or ungrouped), use horizontal = TRUE. Specifying stacked = 'gg' or 'ms' automatically makes horizontal = TRUE
#' @param stacked DEFAULT = 'NULL'; For stacked barcharts, use stacked = 'gg' for ggplot and 'ms' for mschart
#' @param topbox DEFAULT = NULL; Can be set to a numeric value, ex: topbox = 2 to order by top2box instead of topbox
#' @param none_other DEFAULT = TRUE; Automatically puts "Other", "None of the above", and "Prefer not to say" options at the bottom. Change to FALSE to let them stay ordered elsewhere in the chart
#' @param num_fmt DEFAULT = "percent"; Other option is "general", use this when working with whole numbers rather than percents/proportions
#' @param percent_all DEFAULT = FALSE; When FALSE, will put a \% next to only the first number label on the chart. If set to TRUE, will put \%s next to all numbers labels
#' @keywords order label arrange
#' @importFrom rlang .data
#' @examples
#' # Ungrouped, put in descending order of the result
#' frequencies <- tibble::tibble(
#'   label = c('Brand 1', 'Brand 2', 'Brand 3', 'Brand 4', 'Brand 5'),
#'   result = c(.25, .15, .20, .10, .30),
#'   value = c(1, 2, 3, 4, 5)
#' ) %>% order_label()
#'
#' # Grouped, with an inherent order for the label, or the brand
#' frequencies <- tibble::tibble(
#'   label = rep(c('Brand 1', 'Brand 2', 'Brand 3', 'Brand 4', 'Brand 5'), 2),
#'   result = c(.20, .20, .30, .10, .20, .20, .30, .20, .20, .10),
#'   value = rep(c(1, 2, 3, 4, 5), 2),
#'   group_var = c(rep('Group A', 5), rep('Group B', 5))
#' ) %>% order_label(
#'   group_var = group_var,
#'   inherent_order_label = TRUE
#' )
#'
#' # Stacked, will be using this frequencies in an mschart later on
#' frequencies <- tibble::tibble(
#'   label = rep(c('Promoter', 'Passive', 'Detractor'), 3),
#'   result = c(.33, .33, .34, .20, .30, .50, .25, .50, .25),
#'   value = rep(c(1, 2, 3), 3),
#'   group_var = c(rep('Group A', 3), rep('Group B', 3), rep('Group C', 3))
#' ) %>% order_label(
#'   group_var = group_var,
#'   stacked = 'ms'
#' )
#' @export

order_label <- function(
  dataset, # will likely be frequencies
  label_var = label,
  group_var = 'NULL',
  inherent_order_label = FALSE,
  inherent_order_group = FALSE,
  label_first = NA,
  group_first = NA,
  rev_label = FALSE,
  rev_group = FALSE,
  label_last = NA,
  group_last = NA,
  horizontal = FALSE,
  stacked = c('NULL', 'ms', 'gg'),
  topbox = NULL,
  none_other = TRUE,
  num_fmt = c("percent", "general"),
  percent_all = FALSE
) {

### Test matching arguments
  num_fmt <- rlang::arg_match(num_fmt)
  stacked <- rlang::arg_match(stacked)


### Flags
  # Enquo flags
  label <- NULL
  label_var_flag <- dplyr::enquo(label_var)
  group_var_flag <- dplyr::enquo(group_var)
  group_var_char <- rlang::as_name(group_var_flag)
  # Stacked flags: bars always inherently ordered
  inherent_order_label <- ifelse(
    stacked != 'NULL',
    TRUE,
    inherent_order_label
  )
  # Grouping flags
  if (group_var_char == 'NULL') {
    grouped <- FALSE
  } else {
    grouped <- TRUE
  }
  # Flags for putting a specific label/group first
  specifically_ordered <- ifelse(
    is.character(label_first) == TRUE,
    TRUE,
    FALSE
  )
  specifically_ordered_group <- ifelse(
    is.character(group_first) == TRUE,
    TRUE,
    FALSE
  )

### Stop if group_var not specified but other grouping arguments are
  if ((
    inherent_order_group == TRUE |
      rev_group == TRUE |
      !is.na(group_first) |
      !is.na(group_last)
    ) & grouped == FALSE) {
    stop("You specified a grouping argument but not the group_var. Either add in a variable for group_var or do not run other grouping arguments.")
  }
  if (stacked != 'NULL' & grouped == FALSE) {
    warning('You used a "stacked" ordering system without specifying group_var. Is your data grouped?')
  }

  if(grouped == FALSE & !is.null(topbox)) {
    stop('You cannot use the topbox argument on ungrouped data.')
  }

  if(inherent_order_group == TRUE & !is.null(topbox)) {
    stop('You cannot use the topbox argument when inherent_order_group is TRUE.')
  }

### Prep work
  dataset <- dataset %>% dplyr::ungroup()
  dataset <- dataset %>% factors(grouped, !!group_var_flag, !!label_var_flag)
  # dataset <- reverse_label(dataset, grouped, !!group_var_flag, !!label_var_flag, rev_label)

### (1) ungrouped Section
  if (grouped == FALSE) {
    dataset <- section_ungrouped(
      dataset,
      grouped,
      specifically_ordered,
      inherent_order_label,
      stacked,
      label_first,
      rev_label
      )
### Arranging WITH grouping variables
  } else {
  # (2) Grouped Section: arranging for specific group and label to be first
    dataset <- section_grouped_specifics(
      dataset,
      specifically_ordered,
      label_first,
      inherent_order_label,
      group_var,
      inherent_order_group,
      group_first,
      specifically_ordered_group,
      rev_group
      )
  # (3) Grouped Section: arranging for specific group to be first
    dataset <- section_grouped_specifics_nolab(
      dataset,
      specifically_ordered,
      inherent_order_label,
      group_var,
      inherent_order_group,
      group_first,
      specifically_ordered_group,
      rev_group,
      rev_label
      )
  # (4) Grouped Section: inherent order of grouping variables
    dataset <- section_grouped_ordered(
      dataset,
      specifically_ordered,
      label_first,
      inherent_order_label,
      group_var,
      inherent_order_group,
      group_first,
      specifically_ordered_group,
      rev_group,
      rev_label
      )
  # (5) Grouped Section: arranging grouping variables if group NOT inherently ordered
    dataset <- section_grouped_unordered(
      dataset,
      specifically_ordered,
      label_first,
      inherent_order_label,
      group_var,
      inherent_order_group,
      group_first,
      specifically_ordered_group,
      rev_group,
      rev_label
      )
  }
### topbox
  dataset <- topbox_fun(dataset, topbox)
### label_last & group_last
  dataset <- label_last_fun(dataset, label_last, horizontal, stacked)
  dataset <- group_last_fun(dataset, group_last, horizontal, stacked)
### Put "None" & "Other" at bottom
  dataset <- none_other_fun(dataset, none_other, grouped)
### Horizontal
  dataset <- horizontal_chart(dataset, horizontal, grouped)
### Stacked
  dataset <- stacked_chart(dataset, stacked, grouped, inherent_order_group, specifically_ordered_group)
  dataset <- stacked_chart_ms(dataset, stacked, grouped, inherent_order_group, specifically_ordered_group)
### num_fmt
  dataset <- num_fmt_orderlabel(dataset, num_fmt, percent_all)
### arrange_by_factor
  dataset <- arrange_by_factor(dataset, grouped)
  return(dataset)
}


#### ***** Private order_label Functions ***** ####
#### Blank values ####
blank_values <- function(
  dataset
) {
  # If no value, add in place filler
  if (
    any(names(dataset) == 'value') == FALSE
  ) {
    dataset$value <- 'x'
  } else {
    dataset <- dataset
  }

  # If no label, add in place filler
  if (
    any(names(dataset) == 'label') == FALSE
  ) {
    dataset$label <- 'x'
  } else {
    dataset <- dataset
  }
  return(dataset)
}

#### Add label ####
add_label <- function(
  dataset,
  label_var
) {
  dataset <- blank_values(dataset)
  label_var_flag <- dplyr::enquo(label_var)
    dataset <- dataset %>%
      dplyr::mutate(
        label = !!label_var_flag
      ) %>%
      dplyr::relocate(
        'label',
        .after = 'value'
      )
}

#### Add group ####
add_group <- function(
  dataset,
  grouped,
  group_var,
  label_var
) {
  # Frequencies with a grouping variable must be grouped for following section
  if (grouped == TRUE) {
    label_var_flag <- dplyr::enquo(label_var)
    dataset <- add_label(dataset, !!label_var_flag)
    group_var_flag <- dplyr::enquo(group_var)
    dataset <- dataset %>%
      dplyr::ungroup() %>%
      dplyr::mutate(
        group_var = !!group_var_flag
      ) %>%
      dplyr::group_by(
        group_var
        )
  } else {
    label_var_flag <- dplyr::enquo(label_var)
    dataset <- add_label(dataset, !!label_var_flag)
  }
}

#### Factors ####
# When inherent_order == TRUE, labels are ordered by value #s
# But factored variables won't have #s in value column. Let's give them some
factors <- function(
  dataset,
  grouped,
  group_var,
  label_var
){
  label_var_flag <- dplyr::enquo(label_var)
  group_var_flag <- dplyr::enquo(group_var)
  dataset <- add_group(dataset, grouped, !!group_var_flag, !!label_var_flag)
  # When "value" is factored, value needs to be changed to .number
  # When "value" was completely missing or all the same, values needs to be changed to distinct .number
  if (dataset$value[1] == dataset$label[1] |
     length(unique(dataset$value)) == 1 |
     dataset$value[1] != '1'
  ) {
    max_lab <- length(unique(dataset$label))
    dataset <- dataset %>%
      dplyr::mutate(
        value = 1:max_lab
      )
  } else {
    dataset <- dataset
  }

  # Now convert value to numeric for inherent_orders
  dataset <- dataset %>%
    dplyr::mutate(
      value = gsub("[^0-9.]", "", .data$value) %>%
        as.character() %>%
        as.numeric()
    )
  return(dataset)
}

#### Reverse label inherent order ####
reverse_label <- function(
  dataset,
  grouped,
  group_var,
  label_var,
  rev_label
) {
  label_var_flag <- dplyr::enquo(label_var)
  group_var_flag <- dplyr::enquo(group_var)
  dataset <- factors(dataset, grouped, !!group_var_flag, !!label_var_flag)
  if (rev_label == TRUE){
    max_val <- max(dataset$value)
    min_val <- min(dataset$value)
    dataset <- dataset %>%
      dplyr::mutate(
        value = rev(.data$value)
      )
  } else {
    dataset <- dataset
  }
}

#### Reverse label unordered ####
reverse_label_unordered <- function(
  dataset,
  rev_label
) {
  if (rev_label == TRUE){
    dataset <- dataset  %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::arrange(
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::arrange(
        label = forcats::fct_rev(.data$label)
      ) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label)
      )
  } else {
    dataset <- dataset
  }
}

#### (1) Ungrouped Section ####
section_ungrouped <- function(
  dataset,
  grouped,
  specifically_ordered,
  inherent_order_label,
  stacked,
  label_first,
  rev_label
) {
  if (grouped == FALSE) {
    dataset <- ungrouped1(dataset, specifically_ordered, inherent_order_label, label_first, rev_label)
    dataset <- ungrouped2(dataset, specifically_ordered, inherent_order_label, label_first, rev_label)
    dataset <- ungrouped3(dataset, stacked, rev_label)
    dataset <- ungrouped4(dataset, specifically_ordered, inherent_order_label, rev_label)
    dataset <- ungrouped5(dataset, specifically_ordered, inherent_order_label, rev_label)
  } else {
    data <- dataset
  }
  return(dataset)
}

#### ungrouped 1 ####
# Arranging with specific label first
ungrouped1 <- function(
  dataset,
  specifically_ordered,
  inherent_order_label,
  label_first,
  rev_label
) {
  if (specifically_ordered == TRUE &
     inherent_order_label == FALSE) {
    freqs1 <- dataset %>%
      dplyr::filter(.data$label == label_first)
    freqs2 <- dataset %>%
      dplyr::filter(.data$label != label_first) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      ) %>%
      reverse_label_unordered(rev_label)
    dataset <- dplyr::bind_rows(freqs1, freqs2) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == label_first,
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      )
  } else {
    dataset <- dataset
  }
}

#### ungrouped 2 ####
ungrouped2 <- function(
  dataset,
  specifically_ordered,
  inherent_order_label,
  label_first,
  rev_label
) {
  if (specifically_ordered == TRUE &
     inherent_order_label == TRUE) { # Arranging with specific label first, then inherent
    freqs1 <- dataset %>%
      dplyr::filter(.data$label == label_first)
    freqs2 <- dataset %>%
      dplyr::filter(.data$label != label_first) %>%
      dplyr::arrange(
        .data$value
      ) %>%
      reverse_label_unordered(rev_label)
    dataset <- dplyr::bind_rows(freqs1, freqs2) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == label_first,
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      )
  } else {
    dataset <- dataset
  }
}

#### ungrouped 3 ####
ungrouped3 <- function(
  dataset,
  stacked,
  rev_label
) {
  if (stacked != 'NULL') {
    dataset <- dataset %>%
      dplyr::arrange(
        .data$value, .data$result
      ) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        label = forcats::fct_rev(.data$label)
      ) %>%
      reverse_label_unordered(rev_label)
  } else {
    dataset <- dataset
  }
}

#### ungrouped 4 ####
# Arranging for non inherent order labels
ungrouped4 <- function(
  dataset,
  specifically_ordered,
  inherent_order_label,
  rev_label
) {
  if (inherent_order_label == FALSE &
     specifically_ordered == FALSE
  ) {
    dataset <- dataset %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      ) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      reverse_label_unordered(rev_label)
  } else {
    dataset <- dataset
  }
}

#### ungrouped 5 ####
ungrouped5 <- function(
  dataset,
  specifically_ordered,
  inherent_order_label,
  rev_label
) {
  if (inherent_order_label == TRUE &
     specifically_ordered == FALSE
  ) { # Arranging for inherent order labels
    dataset <- dataset %>%
      dplyr::arrange(
        .data$value, .data$result
      ) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      reverse_label_unordered(rev_label)
  } else {
    dataset <- dataset
  }
}




#### Reverse Group ####
reverse_group <- function(
  dataset,
  rev_group
) {
  if (rev_group == TRUE) {
    options(warn = -1) # Warning about unknown levels of Other, NOA, PNTS, that's fine
    dataset <- dataset %>%
      dplyr::ungroup() %>%
      dplyr::arrange(
        group_var = forcats::fct_inorder(.data$group_var)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      ) %>%
      dplyr::arrange(
        group_var = forcats::fct_rev(.data$group_var)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      ) %>%
      dplyr::arrange(
        group_var = forcats::fct_relevel(
          .data$group_var,
          "Other",
          'None of the above',
          "Prefer not to say",
          after = Inf
        )
      ) %>%
      dplyr::mutate(group_var = forcats::fct_inorder(.data$group_var))
  } else {
    dataset <- dataset
  }
}


#### Reverse label unordered pt 2 ####
reverse_label_unordered2 <- function(
  dataset,
  rev_label
) {
  if (rev_label == TRUE) {
    dataset <- dataset %>%
      dplyr::ungroup() %>%
      dplyr::arrange(
        group_var = forcats::fct_inorder(.data$group_var)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      ) %>%
      dplyr::arrange(
        group_var = forcats::fct_rev(.data$group_var)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )  %>%
      dplyr::group_by(.data$group_var)
  } else {
    dataset <- dataset
  }
}

#### (2) Grouped Specifics for group and label ####
section_grouped_specifics <- function(
  dataset,
  specifically_ordered,
  label_first,
  inherent_order_label,
  group_var,
  inherent_order_group,
  group_first,
  specifically_ordered_group,
  rev_group # fix reversed groups in this section
) {
  if (specifically_ordered_group == TRUE &
     specifically_ordered == TRUE
  ) {
    dataset <- dataset %>%
      dplyr::ungroup() %>%
      dplyr::mutate(
        group_var = forcats::as_factor(group_var)
      )

    dataset <- grouped_specific1(dataset, inherent_order_label, inherent_order_group, label_first, group_first)
    dataset <- grouped_specific2(dataset, inherent_order_label, inherent_order_group, label_first, group_first)
    dataset <- grouped_specific3(dataset, inherent_order_label, inherent_order_group, label_first, group_first)
    dataset <- grouped_specific4(dataset, inherent_order_label, inherent_order_group, label_first, group_first)
    dataset <- dataset %>% reverse_group(rev_group)
  } else {
    dataset <- dataset
  }
  return(dataset)
}

#### Grouped specifics 1 ####
grouped_specific1 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  label_first,
  group_first
) {
  if (inherent_order_label == FALSE & #No inherent order for group/label
     inherent_order_group == FALSE) {
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first &
          .data$label == label_first
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      )
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label == label_first
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      )
    freqs3 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      )
    freqs4 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label != label_first
      )
    dataset <- dplyr::bind_rows(freqs1, freqs2, freqs3, freqs4) %>%
      dplyr::mutate(
        percent_label = ifelse(
          .data$label == label_first & .data$group_var == group_first,
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        ),
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### Grouped specifics 2 ####
grouped_specific2 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  label_first,
  group_first
) {
  if (inherent_order_label == TRUE & #label inherent
     inherent_order_group == FALSE) { #group NOT
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first &
          .data$label == label_first
      )
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label == label_first
      ) %>%
      dplyr::arrange(
        .data$value,
        dplyr::desc(.data$result)
      )
    freqs3 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first &
          .data$label != label_first
      ) %>%
      dplyr::arrange(
        .data$value
      )
    freqs4 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label != label_first
      ) %>%
      dplyr::arrange(
        .data$value
      )
    dataset <- dplyr::bind_rows(freqs1, freqs2, freqs3, freqs4) %>%
      dplyr::mutate(
        percent_label = ifelse(
          .data$group_var == group_first & .data$label == label_first,
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        ),
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### Grouped specifics 3 ####
grouped_specific3 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  label_first,
  group_first
) {
  if (inherent_order_label == TRUE & #Both label/group inherently ordered
     inherent_order_group == TRUE) {
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first &
          .data$label == label_first
      )
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$label != label_first &
          .data$group_var == group_first
      ) %>%
      dplyr::arrange(
        .data$value
      )
    freqs3 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first
      ) %>% dplyr::arrange(
        .data$value,
        .data$group_var
      )
    dataset <- dplyr::bind_rows(freqs1, freqs2, freqs3) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == label_first & .data$group_var == group_first,
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### Grouped specifics 4 ####
grouped_specific4 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  label_first,
  group_first
) {
  if (inherent_order_label == FALSE &
     inherent_order_group == TRUE) {
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first &
          .data$label == label_first
      )
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first &
          .data$label != label_first
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      )
    freqs3 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label == label_first
      ) %>%
      dplyr::arrange(
        .data$group_var
      )
    freqs4 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label != label_first
      ) %>%
      dplyr::arrange(
        .data$group_var
      )
    dataset <- dplyr::bind_rows(freqs1, freqs2, freqs3, freqs4) %>%
      dplyr::mutate(
        percent_label = ifelse(
          .data$group_var == group_first & .data$label == label_first,
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        ),
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### (3) Grouped, specific for group only ####
section_grouped_specifics_nolab <- function(
  dataset,
  specifically_ordered,
  inherent_order_label,
  group_var,
  inherent_order_group,
  group_first,
  specifically_ordered_group,
  rev_group, #fix reversed groups in this section
  rev_label
) {
  if (specifically_ordered_group == TRUE &
     specifically_ordered == FALSE
  ) {
    dataset <- dataset %>%
      dplyr::ungroup() %>%
      dplyr::mutate(
        group_var = forcats::as_factor(.data$group_var)
      )

    dataset <- grouped_specific5(dataset, inherent_order_label, inherent_order_group, group_first, rev_label, rev_group)
    dataset <- grouped_specific6(dataset, inherent_order_label, inherent_order_group, group_first, rev_label, rev_group)
    dataset <- grouped_specific7(dataset, inherent_order_label, inherent_order_group, group_first, rev_label, rev_group)
    dataset <- grouped_specific8(dataset, inherent_order_label, inherent_order_group, group_first, rev_label, rev_group)
    dataset <- dataset %>% reverse_group(rev_group) %>%
      dplyr::mutate(
        group_var = forcats::fct_relevel(
          .data$group_var,
          group_first
        )
      )
  } else {
    dataset <- dataset
  }
  return(dataset)
}


#### Grouped Specifics 5 ####
grouped_specific5 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  group_first,
  rev_label,
  rev_group
) {
  if (inherent_order_label == FALSE &
     inherent_order_group == FALSE) {
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      ) %>% reverse_label_unordered(rev_label)
    group1 <- freqs1$label[1]
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label == group1
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      ) %>% reverse_label_unordered2(rev_label)
    freqs3 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label != group1
      )
    freqs_combo <- dplyr::bind_rows(freqs2, freqs3)
    dataset <- dplyr::bind_rows(freqs1, freqs_combo) %>%
      dplyr::mutate(
        percent_label = ifelse(
          .data$label == .data$label[1] & .data$group_var == group_first,
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        ),
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### Grouped Specifics 6 ####
grouped_specific6 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  group_first,
  rev_label,
  rev_group
) {
  if (inherent_order_label == TRUE & #No inherent order for group/label
     inherent_order_group == FALSE) {
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first
      ) %>%
      dplyr::arrange(
        .data$value,
        dplyr::desc(.data$result)
      )
    group1 <- freqs1$label[1]
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label == group1
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      )
    freqs3 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first &
          .data$label != group1
      )
    freqs_combo <- dplyr::bind_rows(freqs2, freqs3)
    dataset <- dplyr::bind_rows(freqs1, freqs_combo) %>%
      dplyr::mutate(
        percent_label = ifelse(
          .data$group_var == group_first & .data$label == .data$label[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        ),
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### Grouped Specifics 7 ####
grouped_specific7 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  group_first,
  rev_label,
  rev_group
) {
  if (inherent_order_label == TRUE &
     inherent_order_group == TRUE) {
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first
      ) %>%
      dplyr::arrange(
        .data$value
      )
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first
      ) %>% dplyr::arrange(
        .data$value,
        .data$group_var
      )
    dataset <- dplyr::bind_rows(freqs1, freqs2) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1] & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### Grouped Specifics 8 ####
grouped_specific8 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  group_first,
  rev_label,
  rev_group
) {
  if (inherent_order_label == FALSE &
     inherent_order_group == TRUE) {
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$group_var == group_first
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      ) %>% reverse_label_unordered(rev_label)
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$group_var != group_first
      )
    dataset <- dplyr::bind_rows(freqs1, freqs2) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1] & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### (4) Grouped Ordered Section ####
section_grouped_ordered <- function(
  dataset,
  specifically_ordered,
  label_first,
  inherent_order_label,
  group_var,
  inherent_order_group,
  group_first,
  specifically_ordered_group,
  rev_group,
  rev_label
) {
  if (specifically_ordered_group == FALSE &
     inherent_order_group == TRUE
  ) {
    dataset <- dataset %>%
      dplyr::ungroup() %>%
      dplyr::mutate(group_var = forcats::fct_inorder(.data$group_var))

    dataset <- grouped_ordered1(dataset, inherent_order_label, inherent_order_group, specifically_ordered, label_first, rev_group)
    dataset <- grouped_ordered2(dataset, inherent_order_label, inherent_order_group, specifically_ordered, label_first, rev_group, rev_label)
    dataset <- grouped_ordered3(dataset, inherent_order_label, inherent_order_group, specifically_ordered, rev_group, rev_label)
    dataset <- grouped_ordered4(dataset, inherent_order_label, inherent_order_group, specifically_ordered, rev_group)
  } else {
    dataset <- dataset
  }
  return(dataset)
}

#### Grouped Ordered 1 ####
grouped_ordered1 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  specifically_ordered,
  label_first,
  rev_group
) {
  if (specifically_ordered == TRUE &
     inherent_order_label == TRUE) { # Arranging for specific label first
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$label == label_first
      ) %>%
      dplyr::arrange(
        .data$group_var
      ) %>%
      reverse_group(rev_group)
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$label != label_first
      ) %>% dplyr::arrange(
        .data$value,
        .data$group_var
      )
    dataset <- dplyr::bind_rows(freqs1, freqs2) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1] & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### Grouped Ordered 2 ####
grouped_ordered2 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  specifically_ordered,
  label_first,
  rev_group,
  rev_label
) {
  if (specifically_ordered == TRUE &
     inherent_order_label == FALSE) { # Arranging for specific label first
    dataset <- dataset %>% reverse_group(rev_group)
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$group_var == .data$group_var[1] &
          .data$label == label_first
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      )
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$group_var == .data$group_var[1] &
          .data$label != label_first
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      ) %>%
      reverse_label_unordered(rev_label)
    freqs3 <- dataset %>%
      dplyr::filter(
        .data$group_var != .data$group_var[1]
      )

    dataset <- dplyr::bind_rows(freqs1, freqs2, freqs3) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == label_first & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### Grouped Ordered 3 ####
grouped_ordered3 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  specifically_ordered,
  rev_group,
  rev_label
) {
  if (inherent_order_label == FALSE &
     specifically_ordered == FALSE) {
    dataset <- dataset %>%
      dplyr::arrange(
        .data$group_var,
        dplyr::desc(.data$result)
      ) %>%
      reverse_label_unordered(rev_label) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1] & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      ) %>% reverse_group(rev_group)

  } else {
    dataset <- dataset
  }
}

#### Grouped Ordered 4 ####
grouped_ordered4 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  specifically_ordered,
  rev_group
) {
  if (inherent_order_label == TRUE &
     specifically_ordered == FALSE
  ) {
    dataset <- dataset %>%
      dplyr::arrange(
        .data$group_var,
        .data$value,
        .data$result
      ) %>%
      reverse_group(rev_group) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1] & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}


#### (5) Grouped Unordered Section ####
section_grouped_unordered <- function(
  dataset,
  specifically_ordered,
  label_first,
  inherent_order_label,
  group_var,
  inherent_order_group,
  group_first,
  specifically_ordered_group,
  rev_group,
  rev_label
) {
  if (specifically_ordered_group == FALSE &
     inherent_order_group == FALSE
  ) {
    dataset <- dataset %>%
      dplyr::ungroup() %>%
      dplyr::mutate(
        group_var = forcats::as_factor(.data$group_var)
      )

    dataset <- grouped_unordered1(dataset, inherent_order_label, inherent_order_group, specifically_ordered, label_first, rev_group, rev_label)
    dataset <- grouped_unordered2(dataset, inherent_order_label, inherent_order_group, specifically_ordered, label_first, rev_group)
    dataset <- grouped_unordered3(dataset, inherent_order_label, inherent_order_group, specifically_ordered, rev_group, rev_label)
    dataset <- grouped_unordered4(dataset, inherent_order_label, inherent_order_group, specifically_ordered, rev_group)
  } else {
    dataset <- dataset
  }
  return(dataset)
}

#### Grouped Unordered 1 ####
grouped_unordered1 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  specifically_ordered,
  label_first,
  rev_group,
  rev_label
) {
  if (specifically_ordered == TRUE &
     inherent_order_label == FALSE) {
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$label == label_first
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      ) %>%
      reverse_label_unordered(rev_label)
    group1 <- freqs1$group_var[1]
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$label != label_first &
          .data$group_var == group1
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      )
    freqs3 <- dataset %>%
      dplyr::filter(
        .data$label != label_first &
          .data$group_var != group1
      )
    dataset <- dplyr::bind_rows(freqs1, freqs2, freqs3) %>%
      dplyr::mutate(
        percent_label = ifelse(
          .data$label == label_first & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        ),
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      ) %>%
      reverse_group(rev_group)
  } else {
    dataset <- dataset
  }
}

#### Grouped Unordered 2 ####
grouped_unordered2 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  specifically_ordered,
  label_first,
  rev_group
) {
  if (specifically_ordered == TRUE &
     inherent_order_label == TRUE) { #Arranging for specific label first
    freqs1 <- dataset %>%
      dplyr::filter(
        .data$label == label_first
      ) %>%
      dplyr::arrange(
        .data$value,
        dplyr::desc(.data$result),
        .data$group_var
      )
    group1 <- freqs1$group_var[1]
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$label != label_first &
          .data$group_var == group1
      ) %>%
      dplyr::arrange(
        .data$value
      )
    freqs3 <- dataset %>%
      dplyr::filter(
        .data$label != label_first &
          .data$group_var != group1
      )
    dataset <- dplyr::bind_rows(freqs1, freqs2, freqs3) %>%
      dplyr::mutate(
        percent_label = ifelse(
          .data$label == label_first & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        ),
        label = forcats::fct_inorder(.data$label)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      ) %>%
      reverse_group(rev_group)
  } else {
    dataset <- dataset
  }
}

#### Grouped Unordered 3 ####
grouped_unordered3 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  specifically_ordered,
  rev_group,
  rev_label
) {
  if (inherent_order_label == FALSE &
     specifically_ordered == FALSE
  ) {
    freqs1 <- dataset %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      )  %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label)
      ) %>%
      reverse_label_unordered(rev_label) %>%
      dplyr::filter(
        .data$label == .data$label[1]
      )
    group1 <- freqs1$label[1]
    freqs2 <- dataset %>%
      dplyr::filter(
        .data$label != group1
      ) %>%
      dplyr::arrange(
        dplyr::desc(.data$result)
      ) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label)
      ) %>% reverse_label_unordered(rev_label)
    dataset <- dplyr::bind_rows(freqs1, freqs2) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var),
        percent_label = ifelse(
          .data$label == group1 & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label)
      ) %>%
      reverse_group(rev_group)
  } else {
    dataset <- dataset
  }
}

#### Grouped Unordered 4 ####
grouped_unordered4 <- function(
  dataset,
  inherent_order_label,
  inherent_order_group,
  specifically_ordered,
  rev_group
) {
  if (inherent_order_label == TRUE &
     specifically_ordered == FALSE
  ) {
    dataset <- dataset %>%
      dplyr::arrange(
        .data$value,
        dplyr::desc(.data$result),
        .data$group_var
      ) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1] & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var)
      ) %>%
        reverse_group(rev_group)
  } else {
    dataset <- dataset
  }
}

#### topbox ####
topbox_fun <- function(
  dataset,
  topbox = NULL
) {
  if (is.null(topbox) == FALSE) {
    top2box <- topbox

    dataset <- spreading_top2(dataset, top2box)
    dataset <- ordering_top2(dataset)
  } else { # is.null(topbox)
    dataset <- dataset
  }
}

### spreading_top2
spreading_top2 <- function(dataset, top2box) {
  . <- NULL
  top2_plus1 <- top2box + 1 # Need to add 1 because 1st column is group_var, not top box

  test1 <- dataset %>%
    dplyr::select(
      -'result'
    ) %>%
    dplyr::mutate(value = as.character(.data$value))

  test2 <- dataset %>%
    dplyr::mutate(value1 = .data$value) %>%
    dplyr::select(
      'group_var',
      'value1',
      'result'
    ) %>%
    tidyr::spread(
      key = 'value1',
      value = 'result'
    ) %>%
    dplyr::mutate(
      topbox = dplyr::select(., 2:tidyselect::all_of(top2_plus1)) %>%
        rowSums(na.rm = TRUE)
      ) %>%
    tidyr::gather(
      key = "value",
      value = "result",
      -'group_var',
      -'topbox'
    ) %>%
    dplyr::mutate(value = as.character(.data$value))
  dataset <- dplyr::left_join(
    test1,
    test2
  )
}

### ordering_top2
ordering_top2 <- function(dataset) {
  dataset <- dataset %>%
    dplyr::arrange(
      dplyr::desc(.data$topbox)
    ) %>%
    dplyr::mutate(
      group_var = forcats::fct_inorder(.data$group_var)
    ) %>%
    dplyr::mutate(
      label = forcats::fct_inorder(.data$label)
    ) %>%
    dplyr::mutate(
      percent_label = ifelse(
        .data$label == .data$label[1] & .data$group_var == .data$group_var[1],
        stringr::str_c(.data$result * 100, '%'),
        stringr::str_c(.data$result * 100)
      )
    )
}


#### Horizontal ####
horizontal_chart <- function(
  dataset,
  horizontal,
  grouped
) {
  if (horizontal == TRUE) {
    if (grouped == FALSE) {
      dataset <- dataset %>%
        dplyr::mutate(
          label = forcats::fct_rev(.data$label)
        )
    } else { #grouped == TRUE
      dataset <- dataset %>%
        dplyr::mutate(
          label = forcats::fct_rev(.data$label)
        ) %>%
        dplyr::mutate(
          group_var = forcats::fct_rev(.data$group_var)
        )
    }
  } else { #horizontal == FALSE
    dataset <- dataset
  }
}

#### GG Stacked ####
stacked_chart <- function(
  dataset,
  stacked,
  grouped,
  inherent_order_group,
  specifically_ordered
) {
  if (stacked == 'gg' &
     grouped == FALSE) {
    dataset <- dataset  %>%
      dplyr::mutate(
        label = forcats::fct_rev(.data$label)
      )
  } else if (stacked == 'gg' &
            grouped == TRUE) {
    dataset <- dataset %>%
      dplyr::mutate(
        label = forcats::fct_rev(.data$label)
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_rev(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}

#### MS Stacked ####
stacked_chart_ms <- function(
  dataset,
  stacked,
  grouped,
  inherent_order_group,
  specifically_ordered_group
) {
  if (stacked == 'ms' &
     grouped == TRUE) {
    dataset <- dataset %>%
      dplyr::mutate(
        group_var = forcats::fct_rev(.data$group_var)
      )
  } else {
    dataset <- dataset
  }
}


#### none_other ####
none_other_fun <- function(
  dataset,
  none_other,
  grouped
) {
  if (none_other == TRUE) {
  options(warn = -1) # Warning about unknown levels of Other, NOA, PNTS, that's fine
    dataset <- dataset %>%
      dplyr::arrange(
        label = forcats::fct_relevel(
          .data$label,
          "Other",
          'None of the above',
          "Prefer not to say",
          after = Inf
        )
      ) %>%
      dplyr::mutate(
        label = forcats::fct_inorder(.data$label),
        percent_label = ifelse(
          .data$label == .data$label[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
          )
      )
  } else {
    dataset <- dataset
  }
  #For grouped
  if (grouped == TRUE & none_other == TRUE) {
    options(warn=-1) # Warnings here are about levels not existing, but probs won't in most cases
    dataset <- dataset %>%
      dplyr::arrange(
        group_var = forcats::fct_relevel(
          .data$group_var,
          "Other",
          'None of the above',
          "Prefer not to say",
          after = Inf
        )
      ) %>%
      dplyr::mutate(
        group_var = forcats::fct_inorder(.data$group_var),
        percent_label = ifelse(
          .data$label == .data$label[1] & .data$group_var == .data$group_var[1],
          stringr::str_c(.data$result * 100, '%'),
          stringr::str_c(.data$result * 100)
        )
      )
  } else {
    dataset <- dataset
  }
}



#### label_last ####
label_last_fun <- function(
  dataset,
  label_last,
  horizontal,
  stacked
) {
  label_last_dummy = ifelse(
    is.character(label_last) == TRUE,
    TRUE,
    FALSE
  )

  # Put label_last last
  if (label_last_dummy == TRUE & horizontal == FALSE) {
    dataset <- dataset %>%
      dplyr::arrange(
        label = forcats::fct_relevel(
          .data$label,
          label_last,
          after = Inf
        )
      ) %>%
      dplyr::mutate(label = forcats::fct_inorder(.data$label))
    return(dataset)
    # Put label_last "first" to be last for horizontal
  } else if (label_last_dummy == TRUE & horizontal == TRUE) {
    data_rest <- dataset %>% dplyr::filter(.data$label != label_last)
    data_label <- dataset %>% dplyr::filter(.data$label == label_last)
    data_rest <- data_rest %>%
      dplyr::arrange(
        label = forcats::fct_relevel(
          .data$label
        )
      ) %>%
      dplyr::arrange(label = forcats::fct_rev(.data$label))
    dataset <- dplyr::bind_rows(data_label, data_rest) %>%
      dplyr::mutate(label = forcats::fct_inorder(.data$label))
    # Horizontal and NOT stacked, one more reverse...
    if (stacked == 'NULL') {
      dataset <- dataset %>%
        dplyr::arrange(label = forcats::fct_rev(.data$label)) %>%
        dplyr::mutate(label = forcats::fct_inorder(.data$label))
      return(dataset)
    }
  } else {
    dataset <- dataset
  }
}

#### group_last ####
group_last_fun <- function(
  dataset,
  group_last,
  horizontal,
  stacked
) {
  group_last_dummy = ifelse(
    is.character(group_last) == TRUE,
    TRUE,
    FALSE
  )

  # put group_last last
  if (group_last_dummy == TRUE & horizontal == FALSE) {
    dataset <- dataset %>%
      dplyr::arrange(
        group_var = forcats::fct_relevel(
          .data$group_var,
          group_last,
          after = Inf
        )
      ) %>%
      dplyr::mutate(group_var = forcats::fct_inorder(.data$group_var))
    return(dataset)
    # Put group_last "first" to be last for horizontal
  } else if (group_last_dummy == TRUE & horizontal == TRUE) {
    data_rest <- dataset %>% dplyr::filter(.data$group_var != group_last)
    data_label <- dataset %>% dplyr::filter(.data$group_var == group_last)
    data_rest <- data_rest %>%
      dplyr::arrange(
        group_var = forcats::fct_relevel(
          .data$group_var
        )
      ) %>%
      dplyr::arrange(group_var = forcats::fct_rev(.data$group_var))
    dataset <- dplyr::bind_rows(data_label, data_rest) %>%
      dplyr::mutate(group_var = forcats::fct_inorder(.data$group_var))
    # Horizontal and NOT stacked, one more reverse...
   if (stacked == 'NULL') {
    dataset <- dataset %>%
      dplyr::arrange(group_var = forcats::fct_rev(.data$group_var)) %>%
      dplyr::mutate(group_var = forcats::fct_inorder(.data$group_var))
    return(dataset)
  }
    } else {
    dataset <- dataset
  }
}


#### num_fmt ####
num_fmt_orderlabel <- function(
  dataset,
  num_fmt,
  percent_all
) {
  if (num_fmt == "percent") {
    if (percent_all == TRUE) {
      dataset <- dataset %>%
        dplyr::mutate(percent_label = stringr::str_c(.data$result * 100, '%'))
    }
    dataset <- dataset
  } else {
    dataset <- dataset %>%
      dplyr::mutate(percent_label = as.character(.data$result))
  }
}


# arrange_by_factor: mschart htmltools updated ordering --------------------------------------
arrange_by_factor <- function(
  dataset,
  grouped
  ) {
  if (grouped == FALSE) {
    dataset <- dataset %>%
      dplyr::arrange(.data$label)
  } else {
    dataset <- dataset %>%
      dplyr::arrange(
        .data$label,
        .data$group_var
      )
  }
}
nick-moffitt/orderlabel documentation built on Nov. 9, 2023, 6:39 p.m.