R/human_import.R

Defines functions import_human

Documented in import_human

#' Import raw human data.
#'
#' @param path
#'
#' @return
#' @export
#'
#' @examples
import_human <- function(path = '~/Dropbox/Calen/Work/search/search_experiments/pre_pandemic/white_noise_covert_nobars_uniform/_data/') {
  # Input and Format Human Data
  library(dplyr)

  files <-
    list.files(
      path,
      full.names  = T
    ) %>% Filter(function(x) {
      grepl("Results", x)
    }, .)

  import.data <- purrr::map(files, R.matlab::readMat)

  ppd <- 60
  cent.x <- 961
  cent.y <- 601

  # Format the raw data.
  formatter.fcn <- function(x) {
    search.data <- x

    fileid <-
      as.character(search.data$ResultsMat[[which(rownames(search.data$ResultsMat) == "Subject")]])

    search.data <-
      search.data$ResultsMat[[which(rownames(search.data$ResultsMat) == "responseFrame")]]

    response.melt <- reshape2::melt(search.data)

    names(response.melt) <-
      c("data_label",
        "blank1",
        "condition",
        "trial",
        "level",
        "session",
        "data")

    response.data <- response.melt %>%
      dplyr::select(-blank1)

    response.data.spread <- response.data %>% tidyr::spread(data_label, data)

    names(response.data.spread) <-
      c(
        "condition",
        "trial",
        "level",
        "session",
        "stimX",
        "stimY",
        "x",
        "y",
        "whichButton",
        "tPresent",
        "clickDistance"
      )


    response.data <- response.data.spread %>%
      filter(!trial == 1) %>%
      mutate(whichButton = ifelse(
        whichButton == 1,
        "present",
        ifelse(whichButton == 3, "absent", "none")
      ))

    response.data <- response.data %>% mutate(clickDistance = sqrt((stimX - x)^2 + (stimY - y)^2)/60)

    response.data[, c("condition", "trial", "session", "whichButton", "tPresent")] <-
      purrr::map(response.data[, c("condition", "trial", "session", "whichButton", "tPresent")], as.factor) # convert columns to factor

    response.data.labeled <- response.data

    response.data.labeled$fileid <- as.factor(fileid) # add subject label

    response.data.labeled$subject <- factor(stringr::str_extract(response.data.labeled$fileid, "anqi|rcw|arw|can"))

        # stim location
    response.data.labeled$stimX <-
      response.data.labeled$stimX - cent.x
    response.data.labeled$stimY <-
      response.data.labeled$stimY - cent.y

    # click location
    response.data.labeled$x <-
      response.data.labeled$x - cent.x
    response.data.labeled$y <-
      response.data.labeled$y - cent.y

    if (stringr::str_detect(unique(response.data.labeled$fileid), "random_size")) {
      szTrials            <- randomsize.trials(x) %>% dplyr::select(-eccentricity)
      szTrials$trial      <- factor(szTrials$trial)
      szTrials$session    <- factor(szTrials$session)
      szTrials$condition  <- factor(szTrials$condition)

      szTrials <- szTrials %>% dplyr::rename(bgSize = data)

      response.data.labeled <- left_join(response.data.labeled, szTrials, by = c("trial", "condition", "level", "session"))
    } else {
      response.data.labeled$bgSize <- 1
    }

    levelLabs <- as.numeric(x$ResultsMat[row.names(x$ResultsMat) == "targetAmplitude"][[1]])
    response.data.labeled$level <- factor(response.data.labeled$level,
                                          levels = unique(response.data.labeled$level), labels = unique(levelLabs))

    levels(response.data.labeled$level) <- round(as.numeric(levels(response.data.labeled$level)),5)

    response.data.formatted <- response.data.labeled %>%
      dplyr::select(trial, level, stimX, stimY, x, y, bgSize, whichButton, tPresent, fileid, subject)

    response.data.formatted.1 <- response.data.formatted %>%
      dplyr::rename(clickX = x, clickY = y, response = whichButton, tLevel = level)

    response.data.formatted.1$tPresent <- ifelse(response.data.formatted.1$tPresent == 1, "present", "absent")

    response.data.formatted.1 <- response.data.formatted.1 %>%
      mutate(clickX = ifelse(response == "absent", NA, clickX),
             clickY = ifelse(response == "absent", NA, clickY))

    response.data.formatted.1 <- response.data.formatted.1 %>%
      mutate(stimX = ifelse(tPresent == "absent", NA, stimX),
             stimY = ifelse(tPresent == "absent", NA, stimY))

    return(response.data.formatted.1)
  }

  # Apply formatting to all subject files.
  formatted.human <- purrr::map(import.data, formatter.fcn)

  # Combine table of subjects
  human.search <- do.call(rbind, formatted.human)

  # Round the position of the stimulus
  human.search$stimX <- round(human.search$stimX / 60, 3)
  human.search$stimY <- round(human.search$stimY / 60, 3)

  # Round the location of the click.
  human.search$clickX <- round(human.search$clickX / 60, 3)
  human.search$clickY <- round(human.search$clickY / 60, 3)

  human.search$trial  <- as.numeric(as.character(human.search$trial))
  human.search$tLevel <- round(as.numeric(as.character(human.search$tLevel)), 3)

  return(human.search)
}
calenwalshe/humansearch documentation built on March 19, 2021, 5:23 p.m.