Использование purrr для создания нескольких новых переменных на основе значений существующих переменных - PullRequest
0 голосов
/ 30 декабря 2018

РЕДАКТИРОВАТЬ: добавлен образец df

У меня есть контрольный список из 3 пунктов (варианты a, b, c), в котором участники могут выбрать столько ответов, сколько они применимы к ним.В моих данных эти ответы хранятся в трех вариантах двоичных ответов (q4___a, q4___b, q4___c).У меня есть эти же данные в четырех разных временных точках (1, 2, 3, 4), поэтому мои переменные закодированы следующим образом:

q4_1___a
q4_1___b
q4_1___c
q4_2___a
q4_2___b

и т. Д., Где q4 - основа, целое число - этовремя, когда данные были собраны, и письмо является вариантом ответа.Вот примерный кадр данных:

df <- data.frame(
 q4_1___a = rbinom(10, 1, .5),
 q4_1___b = rbinom(10, 1, .5),
 q4_1___c = rbinom(10, 1, .5),
 q4_2___a = rbinom(10, 1, .5),
 q4_2___b = rbinom(10, 1, .5),
 q4_2___c = rbinom(10, 1, .5),
 q4_3___a = rbinom(10, 1, .5),
 q4_3___b = rbinom(10, 1, .5),
 q4_3___c = rbinom(10, 1, .5),
 q4_4___a = rbinom(10, 1, .5),
 q4_4___b = rbinom(10, 1, .5),
 q4_4___c = rbinom(10, 1, .5)
)

Мне нужно создать «групповые» переменные, которые объединяют результаты трех различных двоичных переменных ответа в каждый момент времени.Я могу сделать это в момент времени 1, используя следующий код:

df%>%
 mutate(q4_1_group = case_when(
  q4_1___a == 1 & q4_1___b == 0 & q4_1___c == 0 ~ "a",
  q4_1___a == 0 & q4_1___b == 1 & q4_1___c == 0 ~ "b",
  q4_1___a == 0 & q4_1___b == 0 & q4_1___c == 1 ~ "c",
  q4_1___a == 1 & q4_1___b == 1 & q4_1___c == 0 ~ "ab",
  q4_1___a == 1 & q4_1___b == 0 & q4_1___c == 1 ~ "ac",
  q4_1___a == 0 & q4_1___b == 1 & q4_1___c == 1 ~ "bc",
  q4_1___a == 1 & q4_1___b == 1 & q4_1___c == 1 ~ "abc"
 ))

У меня возникли проблемы с выяснением, куда идти отсюда, чтобы повторить все четыре момента времени.По сути, мне нужно изменить 1 во всех именах переменных на 2, 3 и 4, чтобы:

df%>%
 mutate(q4_[i]_group = case_when(
  q4_[i]___a == 1 & q4_[i]___b == 0 & q4_[i]___c == 0 ~ "a",
  q4_[i]___a == 0 & q4_[i]___b == 1 & q4_[i]___c == 0 ~ "b",
  q4_[i]___a == 0 & q4_[i]___b == 0 & q4_[i]___c == 1 ~ "c",
  q4_[i]___a == 1 & q4_[i]___b == 1 & q4_[i]___c == 0 ~ "ab",
  q4_[i]___a == 1 & q4_[i]___b == 0 & q4_[i]___c == 1 ~ "ac",
  q4_[i]___a == 0 & q4_[i]___b == 1 & q4_[i]___c == 1 ~ "bc",
  q4_[i]___a == 1 & q4_[i]___b == 1 & q4_[i]___c == 1 ~ "abc"
 ))

, где [i] соответствует чему-то вроде c(1:4).Я чувствую, что должен быть простой способ сделать это, используя purrr, но я изо всех сил пытаюсь понять это.Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 30 декабря 2018

Мы можем создать набор данных keyval, а затем выполнить объединение

library(tidyverse)
keydat <- data.frame(a = c(1, 0, 0, 1, 1, 0, 1),
                     b = c(0, 1, 0, 1, 0, 1, 1), 
                     c = c(0, 0, 1, 0, 1, 1, 1),
                     group = c("a", "b", "c", "ab", "ac", "bc", "abc"), 
            stringsAsFactors = FALSE)
nm1 <- unique(sub("__.*", "", names(df)))
split.default(df, as.numeric(gsub("^q\\d+_|__.*$", "", names(df)))) %>%
     map(~ .x %>%
              left_join(keydat, by = setNames(letters[1:3], names(.x)))) %>%
     bind_cols %>%
     rename_at(vars(matches('group')), ~paste0(nm1, '_group'))
...