#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