R/dcvts_getresponses.R

Defines functions dcvts_getresponses

Documented in dcvts_getresponses

#' Get responses from DCVTS limesurvey panel.
#' @description `dcvts_getresponses()` fetches responses from DCVTS's limesurvey panel and transforms the data into easily analysable "tidy" format.
#' @param round DCVTS Round. This can be `r1`, `r2` or `r3`.
#' @param status Status of the Interview. `status` is defined as per Limesurvey's convention (This is *not* the final interview result code). Values can be `all`, `complete` or `incomplete`.
#' @param ... Extra parameters. You will likely not need this.
#' @details Sometimes this might take longer depending on your connection.
#' @import dplyr
#' @importFrom readr parse_number
#' @importFrom janitor clean_names
#' @importFrom lubridate as_datetime is.POSIXct date ymd_hms
#' @importFrom limer get_responses
#' @importFrom stringr str_to_title
#' @importFrom rlang .data
#' @export
#' @return A tibble.
#' @examples
#' \dontrun{
#' dcvts_getresponses("r2", "all")
#' dcvts_getresponses("r2", "incomplete")
#' dcvts_getresponses("r1", "complete")
#' }
dcvts_getresponses <- function(round, status, ...) {
  # TODO add further rounds here
  round_id <- case_when(round == "r1" ~ 21,
                        round == "r2" ~ 23,
                        round == "r3" ~ 31)
  if (status == "all" & (round == "r1" | round == "r2")) {
    # binding complete and incomplete responses to one table
    df_responses_raw <- dplyr::bind_rows("complete" = get_responses(iSurveyID = round_id, sCompletionStatus = "complete", ...),
                                     "incomplete" = get_responses(iSurveyID = round_id, sCompletionStatus = "incomplete", ...),
                                     .id = "status") %>%
      clean_names()
  }
  else if (status == "all" & (round == "r3")) {
    # binding complete and incomplete responses to one table
    df_responses_raw <- dplyr::bind_rows("complete" = get_responses(iSurveyID = round_id, sCompletionStatus = "complete", ...),
                                     "incomplete" = get_responses(iSurveyID = round_id, sCompletionStatus = "incomplete", ...) %>%
                                       clean_names() %>%
                                       mutate(wm3_sq001comment = as.character(.data$wm3_sq001comment),
                                              wm3_sq002comment = as.character(.data$wm3_sq002comment),
                                              wm3_sq003comment = as.character(.data$wm3_sq003comment)),
                                     .id = "status")
  }
  else {
    df_responses_raw <- get_responses(iSurveyID = round_id, sCompletionStatus = status, ...) %>%
      clean_names()
  }
  df_responses <- df_responses_raw %>%
    clean_names %>%
    as_tibble() %>%
    rename(responseid = .data$i_id, submitdatetime = .data$submitdate, startdatetime = .data$startdate, enddatetime = .data$datestamp) %>%
    mutate_at(vars(contains("datetime")), as_datetime) %>%
    mutate(iwstat = case_when(status == "incomplete" ~ "incomplete interview",
                              id5 == "Confirmed, Wrong Household" ~ "wrong household",
                              id11 == "No, refused" ~ "appointment refusal",
                              TRUE ~ "complete interview")) %>%
    mutate_if(is.POSIXct, as.character) %>%
    mutate(iwstartdate = date(.data$startdatetime),
           iwenddate = date(.data$enddatetime),
           iwsubmitdate = date(.data$submitdatetime),
           ndays = parse_number(as.character(.data$iwenddate - .data$iwstartdate))) %>%
    mutate(respondent_age = case_when(!is.na(.data$id3) ~ .data$id3,
                                      !is.na(.data$id7) & .data$id7 >= 18 ~ .data$id7)) %>%
    mutate_at(vars(matches("datetime")), ymd_hms) %>%
    select(.data$iwstat, everything())

  return(df_responses)
}
maskegger/dcvts documentation built on Aug. 8, 2020, 4:34 p.m.