R/setgroup.R

#' Modifier les valeurs en classes
#'
#' À partir de l'argument \code{breaks}, \code{setgroup()} modifie les valeurs en classes. Utile si l'on veut par la suite compter le nombre de valeurs par classe.
#'
#' Si \code{max = FALSE}, \code{breaks = c(20,40,60,80)} implique les classes suivantes : `[20;40[`, `[40;60[` et `[60;80[`. Si \code{max = TRUE} et que le maximum de la valeur de la colonne \code{col} est 91, les classes seront : `[20;40[`, `[40;60[`, `[60;80[` et `[80;92[`.\cr\cr
#'
#' @param x Tableau à modifier.
#' @param col CHR, nom de la colonne où l'on veut créer les classes.
#' @param breaks NUM, bornes des classes. Voir section \emph{Details}.
#' @param max LOGI, si on inclut tous les âges supérieurs au maximum de \code{breaks}.
#' @param right LOGI, voir argument \code{right} de la fonction \code{\link[base:cut]{cut}}.
#' @param del LOGI, supprimer les observations qui ne font pas parti d'une classe.
#' 
#' @return data.table avec la colonne convertie en classe.
#'
#' @import data.table
#' @export
#' @examples
#' df <- data.frame(ID = 1:10,
#'                  Sex = sample(c("M", "F"), 10, T),
#'                  Age = seq(5,95,10))
#'
#' # max = FALSE
#' setgroup(df, col = "Age",
#'          breaks = c(0,10,20,30,40,50,60,70,80,90,100),
#'          max = FALSE)
#'
#' # max = TRUE
#' setgroup(df, col = "Age",
#'          breaks = c(0,10,20,30,40,50,60),
#'          max = TRUE)
setgroup <- function(x, col, breaks, max = TRUE, right = FALSE, del = FALSE){

  #### Verification
  ArgCheck()
  if(!is.data.frame(x)) addError("'x' n'est pas de type DATA.FRAME.", argcheck)
  if(!is.character(col)) addError("'col' doit être de type CHARACTER.", argcheck)
  if(!is.numeric(breaks)) addError("'breaks' doit être de type NUMERIC.", argcheck)
  if(!is.logical(max)) addError("'max' doit être de type LOGICAL.", argcheck)
  if(!is.logical(right)) addError("'right' doit être de type LOGICAL.", argcheck)
  if(!is.logical(del)) addError("'del' doit être de type LOGICAL.", argcheck)
  finishArgCheck(argcheck)
  if(!col %in% names(x)) addError(paste0("'",col,"' n'est pas une colonne de 'x'.", argcheck))
  finishArgCheck(argcheck)
  if(!is.numeric(x[[col]])) addError(paste0("La colonne '",col,"' doit être de type NUMERIC.", argcheck))
  finishArgCheck()
  
  
  #### Code ####
  dt <- as.data.table(x)
  # Si max = TRUE -> dernier nombre de 'breaks' est une borne inférieure, on ajoute la borne supérieure
  if(max & max(dt[[col]]) > max(breaks)) breaks <- c(breaks, max(max(dt[[col]]))+1)
  # Modification des valeurs de la colonne en classes
  dt <- dt[, paste(col) := cut(get(col), breaks, right = right)]
  if(del) dt <- dt[!is.na(get(col))]
  dt

}
INESSSQC/INESSS documentation built on May 4, 2019, 4:14 a.m.