R/kobo_label.R

#' @name kobo_label
#' @rdname kobo_label
#' @title  Label data frame
#'
#' @description Insert the full label in data frame based on dictionnary
#' @param data Data where labels must be inserted
#' @param dicofile Name of the file containing the dictionnary. "dico.csv" is used by default.
#' @return A dataframe with the full labels and choices labels. To be used for graphs generation.
#'
#' @author Edouard Legoupil, Elliott Messeiller
#'
#' @export kobo_label

kobo_label <- function(data, dicofile = "dico.csv") {
  
  dico <- read_csv(dicofile)
  
  data.label <- as.data.frame(names(data), stringsAsFactors = FALSE)
  names(data.label)[1] <- "name"
  data.label <- left_join(x=data.label, y=dico, by="name")
  
  for (i in 1:nrow(data.label)) {
    names(data)[i] <- as.character(data.label[ i, c("label")])

    if(data.label$type[i] %in% c("select_one")){
      variablename <- data.label$name[i]
      
      variableLabel <- as.character(data.label[ i, c("label")])
      
      listName <- data.label[data.label$name == variablename & !is.na(data.label$name), "listname"]
      
      choicesLabel <-as.character(unlist(dico[dico$listname == listName & dico$formpart == "answers", "label"]))
      choicesName <-as.character(unlist(dico[dico$listname == listName & dico$formpart == "answers", "name"]))
      
      namesChoices <- c(choicesName = choicesLabel)
      
      data[[variableLabel]] <- choicesLabel[match(data[[variableLabel]], choicesLabel)]
    }
  }
  return(data)
}


#' @name kobo_splitNames
#' @rdname kobo_splitNames
#' @title Rename data frame to delete group deliminators.
#' @param data The dataframe object to be processed
#' @param grpSbl The group deliminator written in [regex]
#' @return data frame with new names.
#' @author Elliott Messeiller
#' @export kobo_splitNames

kobo_splitNames <- function(data, grpSbl){
  
  if(class(data) != "data.frame"){stop("data is not a dataframe, please input a dataframe, or an object that can be cohorsed to one.")}
  
  names_data <- data.frame(name = names(data), stringsAsFactors = FALSE)
  names_data_splitted <- as.data.frame(sapply(names_data, str_split, grpSbl))
  grpSbl_max <- max(str_count(names_data$name, pattern = grpSbl))
  splitted <- as.data.frame(str_split_fixed(names_data$name, pattern = grpSbl, n = grpSbl_max + 1), stringsAsFactors = FALSE)
  
  #  apply(data, 1, function(x, grpSbl_max) ifelse(sum(is.na(x)) == grpSbl_max, "", tail(na.omit(x), 1)))
  
  result <- NA
  for(i in 1:nrow(splitted)){
    for(j in 1:ncol(splitted)){
      if(splitted[i,j] != ""){
        if(j < (grpSbl_max + 1)){
          if(splitted[i, j +1] == ""){
            result[i] <- splitted[i,j]
          }
        } else{
          if(splitted[i,j] != ""){
            result[i] <- splitted[i,j]
          }
        }
      }
    }
  }
  names(data) <- result
  return(data)
}
ElliottMess/koboloadeRlight documentation built on June 20, 2019, 2:24 p.m.