#' 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)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.