R/utils.removeNamelessVars.R

Defines functions removeNamelessVars

Documented in removeNamelessVars

#' Remove Nameless Variables
#'
#' When importing data from Excel or Calc there are some quirks that can happend
#' because of the format of the files. One of those quirks is that "phantom" variables
#' are created, usually with names like "___14"
#'
#' This function tracks those variables and removes them from the data.frame
#'
#' @param data         data.frame to be "cleaned" of empty nameless variables
#' @param starts.with  Vector with "starting" strings that will ve removed to detect nameless vars (default =  c("_"))
#' @param verbose      logical; to be more or less verbose
#' @param DEBUG        logical; to be extra verbose
#'
#' @return             data.frame with the resulting data.frame without the problematic variables
#'
#' @examples
#'
#' data <- mtcars
#' data$`___1` <- NA
#'
#' removeNamelessVars(data)
#'
#' data$`___1` <- 1
#'
#' removeNamelessVars(data)
#'
#'
#' @export
removeNamelessVars <- function(data, starts.with = c("_"), verbose = TRUE, DEBUG = FALSE) {

  crayon <- "crayon" %in% installed.packages()
  if(!is.data.frame(data)) stop("[removeNamelessVars] 'data' is not a data.frame, please provide data.frame")

  ELIMINADAS = FALSE
  for(var in names(data)){
    v <- var
    for(c in starts.with){
      if(DEBUG) message("[removeNamelessVars] Checking: ",c)
      v.new <- sub(paste0(c,'.*'), '', v) #... texto delante de __ (si existe __)
      while(v != v.new) {
        v <- v.new
        v.new <- sub(paste0(c,'.*'), '', v) #... texto delante de __ (si existe __)
      }
    }

    if(v == "") { #... si está vacía es que es una variable con un nombre incorrecto
      valores <- data[,var]
      validos <- sum(!is.na(valores))
      if(validos == 0) {
        if(verbose | DEBUG) message("[removeNamelessVars] Borrando variable ",ifelse(crayon,crayon::bold(var),var)," por estar vacía y con nombre incorrecto")
        data[,var] <- NULL
        ELIMINADAS = TRUE
      } else {
        #... if variable is not empty
        if(verbose | DEBUG) message("[removeNamelessVars] El nombre de la variable no es aceptable pero no está vacía, cambiando nombre")
        vars <- names(data)
        pos <- which(vars == var)
        var_name <- paste0("VAR_",pos)
        unica = FALSE
        cont = 0
        while(!unica & cont < 10){
          if(!(var_name %in% vars)) unica = TRUE
          if(DEBUG) message(var_name," existe en el data.frame, probando otro nombre")
          cont = cont + 1
          var_name <- paste0("VAR_",rep("_",times=cont),pos)
        }
        names(data)[pos] <- var_name
        ELIMINADAS = TRUE #...  se le ha cambiado el nombre que puede verse como una "eliminacion"
      }
    }
  }
  if(!ELIMINADAS & (verbose | DEBUG)) message("[removeNamelessVars] No parece haber columnas erroneas, todas tienen datos o nombres aceptables")

  return(data)
}
feranpre/feR documentation built on Nov. 22, 2022, 2:29 a.m.