R/add_rank_indices.R

Defines functions add_rank_indices

Documented in add_rank_indices

#' Arrange a data frame and rank indexes.
#'
#' @param .data data.frame
#' @param ... force later arguments to bind by name.
#' @param arrangeTerms character vector of column expressions to arrange by.
#' @param orderColumn character name of column to add in-group order marks to.
#' @return .data with order indices added (no ties).
#'
#' @examples
#'
#'
#' datasets::mtcars %.>%
#'   # tibble::rownames_to_column() not currently re-exported by dplyr
#'   mutate_se(., "CarName" := "rownames(.)" ) %.>%
#'   select_se(., c('CarName', 'hp', 'wt')) %.>%
#'   add_rank_indices(., arrangeTerms = c('desc(hp)', 'wt'),
#'                    orderColumn = 'rankID') %.>%
#'   arrange_se(., 'rankID')
#'
#'
#' @export
#'
add_rank_indices <- function(.data,
                             ...,
                             arrangeTerms = NULL,
                             orderColumn) {
  if(length(list(...))>0) {
    stop("seplyr::add_rank_indices unexpected arguments")
  }
  if(!(is.data.frame(.data) || dplyr::is.tbl(.data))) {
    stop("seplyr::add_rank_indices first argument must be a data.frame or tbl")
  }
  `:=` <- NULL # don't let look like an unbound reference to CRAN checker
  if(length(arrangeTerms)<=0) {
    arrangeTerms <- colnames(.data)
  }
  if(!is.character(arrangeTerms)) {
    stop("seplyr::add_rank_indices arrangeTerms should be length 0, or charcter vector")
  }
  # from: https://github.com/tidyverse/rlang/issues/116
  # updated: https://github.com/WinVector/seplyr/issues/3
  env <- parent.frame()
  arrangeQ <- lapply(arrangeTerms,
                     function(si) {
                       rlang::parse_quo(si,
                                        env = env)
                     })
  .data <- dplyr::arrange(.data, !!!arrangeQ)
  # add ordered row-ids globally
  d <- dplyr::mutate(.data, !!orderColumn := 1 )
  d <- dplyr::mutate(d, !!orderColumn := cumsum(!!rlang::sym(orderColumn)) )
  d
}
WinVector/seplyr documentation built on Aug. 26, 2022, 12:01 p.m.