R/kobo_to_r.R

Defines functions kobo_to_r

Documented in kobo_to_r

#' Kobo to R
#'
#' La funcion toma la encuesta descargada de kobo y la pasa a un dataframe
#'
#' @param encuesta El parametro encuesta sera el directorio con el archivo descargado de kobo
#' @param choices El parametro choices es la hoja Choices de la herramienta Kobo
#' @param survey El parametro survey es la hoja Survey de la herramienta Kobo
#'
#' @return - Una lista con los dataframe de todas las hojas de la encuesta y la convierte de numeros a los labels
#' @export
#'
#' @examples name <- "REACH_JMMI_Survey.xlsx"
#' @examples directorio <- paste("Input/", name, sep="")
#' @examples choices <- read_excel(directorio, 'choices')
#'
#' @examples name2 <- "COL2001_JMMI_FECHA.xlsx"
#' @examples encuesta <- paste("Input/", name2, sep="")
#'
#' @examples base <- kobo_to_r(encuesta, choices)
#' @examples base <- kobo_to_r(encuesta = directorio2, choices = choices)


kobo_to_r <- function(encuesta, choices, survey){
  choices = choices %>% mutate(concated_column = paste(list_name, name, sep = ''))
  lista <- list()
  for(i in 1:length(excel_sheets(encuesta))){
    hojas = excel_sheets(encuesta)
    namesheet <- hojas[i]  # Cambiar a i
    print(paste('INICIAMOS EL SHEET', i, ":", namesheet))  # Cambiar a i
    xls1 = read_excel(encuesta, i)  # Cambiar a i
    #pasar todo a character
    xls1 <- setNames(data.frame(lapply(xls1, as.character)),
                     colnames(xls1))
    #pasar los NA a *****
    xls1 <- xls1 %>% mutate(across(everything(), ~replace_na(.x, "-----")))
    #reemplazar los nombres de las variables
    xls1 <- xls1 %>% rename_all(funs(str_replace_all(., "/", " ")))
    #print(names(xls1[i]))

    dataset <- data.frame(Type = character(),
                          Choice = character(),
                          Nombre = character(),
                          Etiqueta = character())

    ##Colocar los nombres de la encuesta en fila
    for (j in 1:length(names(xls1))) {
      dataset <- dataset %>% add_row(Nombre = names(xls1[j]))
    }

    #Colocar el tipo de dato que es para despues obterner los labels
    for (a in 1:length(dataset$Nombre)) {
      for (b in 1:length(survey$name)){
        new_name <- str_split(dataset$Nombre[a], " ")
        new_name <- new_name[[1]][1]
        if (new_name == (replace_na(survey$name[b], ""))) {
          dataset$Type[a] <- survey$type[b]
        }
      }
    }

    ##Colocar choice
    for (i in 1:length(dataset$Nombre)) {
      new_name <- str_split(dataset$Type[i], " ")
      new_name <- new_name[[1]][2]
      dataset$Choice[i] <- new_name
    }

    ##Tipo select_one o select_multiple
    for (i in 1:length(dataset$Nombre)) {
      if (str_detect(replace_na(dataset$Type[i], ""), "select_multiple")){
        dataset$Type[i] <- "select_multiple"
      }else if(str_detect(replace_na(dataset$Type[i], ""), "select_one")){
        dataset$Type[i] <- "select_one"
      }else {
        dataset$Type[i] <- ""
      }
    }

    ##Colocar los dato del select_one para despues pasar de numero a el valor
    for (i in 1:length(names(xls1))){
      for (j in 1:length(dataset$Nombre)){
        if (names(xls1[i]) == dataset$Nombre[j] & dataset$Type[j] == "select_one"){
          xls1[[i]] <- paste(dataset$Choice[j], xls1[[i]], sep = "")
        }
      }
    }

    ## Colocar los dato del select_multiple para despues pasar de numero a el valor
    for (i in 1:length(names(xls1))){
      for (j in 1:length(dataset$Nombre)){
        if (names(xls1[i]) == dataset$Nombre[j] & dataset$Type[j] == "select_multiple" & !(names(xls1[i]) %ilike% " ")){
          xls1[[i]] <- paste(dataset$Choice[j], xls1[[i]], sep = "")
        }
      }
    }

    # Completar los select_multiple, cambiar los espacios por el titulo
    for (i in 1:length(names(xls1))){
      for (j in 1:length(dataset$Nombre)){
        if (names(xls1[i]) == dataset$Nombre[j] & dataset$Type[j] == "select_multiple" & !(names(xls1[i]) %ilike% " ")){
          # Se separa con // para hacerlo mas legible
          xls1[[i]] <- gsub(" ", paste("  // ", dataset$Choice[j], sep = ""), xls1[[i]])
        }
      }
    }


    ##Quitar los datos que tienen el nombre con NA
    for (i in 1:length(names(xls1))) {
      for (j in 1:length(xls1[[3]])){
        x <- str_split(class(xls1[[i]]), " ")
        x <- x[1]
        if (x != "POSIXct") {
          if (str_detect(replace_na(xls1[[i]][j], ""), "-----")) {
            xls1[[i]][j] <- NA
          }
        }
      }
    }

    # Pasar los select multiples de numeros a los valores del cuestionario
    for (i in names(xls1)){
      x <- dataset %>% filter(Nombre == i)
      if (x$Type == "select_multiple" & !(i %ilike% " ")){
        filtro <- choices %>% filter(list_name == x$Choice)
        xls1[[i]] <- paste(xls1[[i]], " ", sep = "")
        for (z in 1:nrow(filtro)){
          xls1[[i]] <- gsub(paste(filtro[["concated_column"]][z], " ", sep = ""), paste(filtro[["label"]][z], "", sep = "") , xls1[[i]])
          # Ajustar los "NA " creados a NA
          xls1[[i]] <- gsub("NA ", NA, xls1[[i]])
        }
      }
    }

    ## Pasar los datos restantes de numeros a los valores del cuestionario
    for (i in names(xls1)) {
      if(sum(is.na(choices$label[match(xls1[[i]],choices$concated_column)])) < length(xls1[[3]])){
        xls1[i] <- choices$label[match(xls1[[i]],choices$concated_column)]
      }
    }

    # Regresar de espacio a /
    xls1 <- xls1 %>% rename_all(funs(str_replace_all(., " ", "/")))

    ##Generar los dataframe con el mismo nombre de la hoja de excel
    ##(paste(namesheet, " ", sep = ""), xls1)
    assign(namesheet, xls1)

    ##lista <- list(data.table(assign(namesheet, xls1)))
    lista[[namesheet]] <- data.table(xls1)
  }

  ##Regrese la lista con los datos
  cat("\n")
  print("Funcion ejecutada con exito...")
  return(lista)
}
jhoneder1993/jmmi_col documentation built on July 27, 2023, 8:10 a.m.