Объединение частично повторяющихся ответов из множественного выбора в длинных данных в R

#r #dplyr

Вопрос:

Я довольно новичок в R, и я пытался написать код, который найдет и объединит ответы на вопросы с несколькими вариантами ответов, когда данные находятся в длинном формате. Данные необходимо широко развернуть, но это невозможно без устранения дубликатов идентификаторов, возникающих в результате этих ответов с множественным выбором. Я хочу объединить дополнительный ответ с множественным выбором с определенным идентификационным номером, чтобы он выглядел так: "affiliation 1, affiliation 2" для отдельного респондента в длинном формате. Я бы предпочел не использовать номера строк, так как данные запоминаются ежемесячно, и номера строк могут не оставаться постоянными. Мне нужно идентифицировать дубликат идентификатора из-за вопроса о множественном выборе и прикрепить его вторичный ответ к другому ответу.

Я пробовал различные версии агрегирования, группировки и обобщения, фильтрации, уникальных и отличительных, но не смог решить проблему.

Вот пример данных:

 ID Question Response 1 question 1 affiliation x 1 question 2 course 1  2 question 1 affiliation y 2 question 2 course 1 3 question 1 affiliation x  3 question 1 affiliation z  4 question 1 affiliation y  

Я хочу, чтобы данные выглядели так:

 ID Question Response Text 1 question 1 affiliation x 1 question 2 course 1  2 question 1 affiliation y 2 question 2 course 1 3 question 1 affiliation x, affiliation z  4 question 1 affiliation y  

так что он подготовлен для pivot_wider.

Несколько примеров кода, которые я пробовал:

 library(tidyverse) course1 lt;- all_surveys %gt;%  filter(`Survey Title`=="course 1") %gt;%  aggregate("ID" ~ "Response Text", by(`User ID`, Question), FUN=sum) %gt;%  pivot_wider(id_cols = c("ID", `Response Date`),   names_from = "Question",   values_from = "Response Text") %gt;% select([questions to be retained from Question])  

Я также пытался

 group_by(question_new, `User ID`) %gt;%  summarize(text = str_c("Response Text", collapse = ", "))  

так же как

 aggregate(c[("Response Text" ~ "question_new")],   by = list(`User ID` = `User ID`, `Response Date` = `Response Date`),   function(x) unique(na.omit(x)))  

и куча разных итераций вышесказанного. Большое вам спасибо, заранее!

Ответ №1:

Мы можем попробовать pivot_wider использовать values_fn = toString :

 df %gt;% pivot_wider(names_from = Question, values_from = response, values_fn = toString)  

небольшой минимальный пример

 dflt;-tibble(ID = c(1,1,2,2), Question = c('question 1', 'question 2', 'question 1', 'question 1'), response = c('affiliation x', 'course 1', 'affiliation x', 'affiliation y'))  # A tibble: 4 × 3  ID Question response   lt;dblgt; lt;chrgt; lt;chrgt;  1 1 question 1 affiliation x 2 1 question 2 course 1  3 2 question 1 affiliation x 4 2 question 1 affiliation y  

выход

 # A tibble: 2 × 3  ID `question 1` `question 2`  lt;dblgt; lt;chrgt; lt;chrgt;  1 1 affiliation x course 1  2 2 affiliation x, affiliation y NA    

Комментарии:

1. Привет @GuedesBF, большое спасибо за ваш ответ! Я думаю, что этот метод поворота решит проблему, так как он работает без повторяющихся ошибок. Однако, когда я запустил его, я заметил, что не все вопросы из переменной Question превратились в столбцы, поэтому я думаю, что мне все равно нужно использовать команду select в конце. Я получил эту ошибку: Error: Can't subset columns that don't exist. Не могли бы вы знать, как это исправить? Большое спасибо!

2. Я не вижу, что здесь может пойти не так. Трудно сказать без надлежащего воспроизводимого примера. Можете ли вы поделиться своими данными и выводами, чтобы воспроизвести проблему?

3. Вы можете использовать dput(data)

4. Возможно, вам потребуется установить id_cols аргумент pivot_wider в ‘ID’ или values_fill в NA