Отфильтруйте данные ответа из двух частей из другого кадра данных и объедините два кадра данных - PullRequest
0 голосов
/ 09 мая 2018

У меня вопрос об опросе в формате: «Вы предпочитаете розу или тюльпан? Представьте, что роза имеет цвета V1 и V2, а тюльпан имеет цвета V3 и V4»

Фактические цвета взяты из комбинаций, содержащихся в одном кадре данных:

Фрейм данных 1 (df1):

structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("red", "ruby"), class = "factor"), 
V2 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L), .Label = c("blue", "violet"), class = "factor"), 
V3 = structure(c(1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 
2L, 2L, 1L, 1L, 2L, 2L), .Label = c("green", "turqoise"), class = "factor"), 
V4 = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L), .Label = c("black", "yellow"), class = "factor")), .Names = c("V1", 
"V2", "V3", "V4"), class = "data.frame", row.names = c(NA, -16L
))

В этом кадре данных (df1) первые два столбца (V1 и V2) соответствуют «розе», а последние два столбца (V3 и V4) соответствуют «тюльпану». Например, респонденту может быть показана комбинация 1 из первого ряда df1, которая является «красный синий зеленый желтый». Это означает, что респондент может выбрать «розу красного и синего цвета» или «зеленый и желтый тюльпан».

Выбор, сделанный респондентами, содержится в отдельном кадре данных (df2). У df2 есть один столбец на каждую комбинацию цветов. Если респонденту 1 была показана первая комбинация из df1 («красный синий зеленый желтый») и выбран тюльпан (зеленый и желтый), выбор отмечен цифрой «2» (для тюльпана, т.е. второго цветка) в первом ряду. из df2. Если респонденту 2 была показана вторая комбинация из df1 («красный синий зеленый черный») и была выбрана роза (красная и синяя), выбор отмечается цифрой «1» (для розы, то есть первого цветка) во втором ряду. из df2. Другими словами, «2» означает «выбранный тюльпан, роза не выбрана», а 1 »означает« выбранная роза, тюльпан не выбран ».

Фрейм данных 2 (df2):

structure(list(respondentID = 1:16, v1 = c(2L, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), v2 = c(NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), v3 = c(NA, 
NA, NA, NA, NA, NA, 1L, NA, NA, NA, NA, NA, NA, NA, NA, NA), 
    v4 = c(NA, NA, NA, 2L, NA, NA, NA, NA, NA, NA, 1L, 2L, NA, 
    NA, NA, NA), v5 = c(NA, NA, 1L, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA), v6 = c(NA, 2L, NA, NA, NA, NA, NA,
    NA, NA, 1L, NA, NA, NA, NA, NA, NA), v7 = c(NA, NA, NA, NA, 
    1L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), v8 = c(NA, 
    NA, NA, NA, NA, 1L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
    ), v9 = c(NA, NA, NA, NA, NA, NA, NA, 2L, NA, NA, NA, NA, 
    NA, NA, NA, NA), v10 = c(NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA), v11 = c(NA, NA, NA, NA, 
    NA, NA, NA, NA, 1L, NA, NA, NA, NA, NA, NA, NA), v12 = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1L, NA, NA, NA
    ), v13 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, 1L, NA, NA), v14 = c(NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA), v15 = c(NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), v16 = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2L
    )), .Names = c("respondentID", "v1", "v2", "v3", "v4", "v5",
"v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", 
"v16"), class = "data.frame", row.names = c(NA, -16L))

Если бы я хотел только узнать, какой цветок был выбран и какие цвета, я мог бы сделать это, используя:

df1_with_id <- df1 %>% 
  setNames(paste0("color", 1:4)) %>%
  mutate(combo = paste0("v", row_number()))

result_df <- df2 %>%
  gather(key = combo, value = val, -respondentID) %>%
  filter(!is.na(val)) %>%
  left_join(df1_with_id, by = "combo") %>%
  arrange(respondentID)

(По этому вопросу)

Но это не дает мне нужный мне формат. Мне нужна информация об обоих параметрах (то есть «rose, который является V1 и V2» и «tulip, который является V3 и V4»), показанная каждому респонденту в отдельных строках, и дополнительная переменная, которая указывает выбор между двумя вариантами, например: Желаемый результат

(На рисунке «1» в переменной выбора относится к варианту, выбранному респондентом, а «0» - не выбранному варианту.)

Я не могу понять, как написать код для организации данных таким образом. Любой совет?

1 Ответ

0 голосов
/ 10 мая 2018

Основная проблема здесь в том, что каждый из столбцов в вашем df1 обозначает два бита информации: тип цветка и номер цвета. Поэтому переименуйте их, включив в них оба бита информации, соберите их в один столбец, разделите ключевой столбец на столбцы flower и color, а затем разверните столбец color. Тогда вам просто нужно преобразовать val в 1, если он соответствует столбцу flower, или 0 в противном случае.

df2 %>%
  gather(key = combo, value = val, -respondentID) %>%
  filter(!is.na(val)) %>%
  left_join(df1_with_id, by = "combo") %>%
  arrange(respondentID) %>% 
  rename(rose_color1 = color1, rose_color2 = color2,
         tulip_color1 = color3, tulip_color2 = color4) %>% 
  gather(color, value, rose_color1:tulip_color2) %>% 
  separate(color, into = c('flower', 'color')) %>% 
  spread(color, value) %>% 
  mutate(val = if_else(val == 1, 'rose', 'tulip')) %>% 
  mutate(val = if_else(val == flower, 1, 0)) %>% 
  select(respondentID, flower, color1, color2, choice = val)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...