#' Calculate and insert columns containing arbitrary quantiles for a particular column
#'
#' @description Calculate and insert columns containing arbitrary quantiles for a particular column
#'
#' @param df A [data.frame]
#' @param col A column name on which to perform the calculations. Must be in `df` or an error
#' will be thrown
#' @param probs A vector of quantile probabilities to pass to [stats::quantile()]
#' @param include_mean If TRUE, include the mean in the output
#'
#' @return A [data.frame] with a new column for each value in the `probs` vector
#'
#' @export
#' @examples
#' library(tibble)
#' library(dplyr)
#' library(purrr)
#' pq <- tribble(
#' ~year, ~grp, ~val,
#' 2000, 1, 2.1,
#' 2001, 1, 3.4,
#' 2002, 1, 4.5,
#' 2003, 1, 5.6,
#' 2004, 1, 6.7,
#' 2000, 2, 3.1,
#' 2001, 2, 4.4,
#' 2002, 2, 5.5,
#' 2003, 2, 6.6,
#' 2004, 2, 8.7,
#' 2000, 3, 13.1,
#' 2001, 3, 14.4,
#' 2002, 3, 15.5,
#' 2003, 3, 16.6,
#' 2004, 3, 18.7)
#'
#' probs <- c(0.05, 0.25, 0.5, 0.75, 0.95)
#'
#' yrs <- sort(unique(pq$year))
#' df <- pq %>%
#' group_by(year) %>%
#' group_map(~ calc_quantiles(.x, col = "val", probs = probs)) %>%
#' map_df(~{.x}) %>%
#' mutate(year = yrs) %>%
#' select(year, everything())
calc_quantiles <- function(df = NULL,
col = NULL,
probs = c(0.05, 0.25, 0.5, 0.75, 0.95),
include_mean = TRUE){
stopifnot(col %in% names(df))
stopifnot(class(df[[col]]) == "numeric")
col_sym <- sym(col)
out <- summarize_at(df,
vars(!!col_sym),
map(probs,
~partial(quantile, probs = .x, na.rm = TRUE)) %>%
set_names(probs))
if(include_mean){
out <- out %>%
mutate(avg = mean(df[[col]]))
}
out
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.