Как использовать R для обработки необработанных данных социального опроса?

Мы часто задаем масштабные вопросы в наших социальных опросах; респонденты выражают свое согласие с нашим утверждением (полностью согласен, согласен, ни то, ни другое, не согласен, совершенно не согласен). Результаты опроса обычно представляются в агрегированном формате, т. е. для каждого вопроса (переменной) ответы представлены в одном столбце, где 5 = полностью согласен, 1 = полностью не согласен и т. д.

Теперь мы столкнулись с новым инструментом опроса, где ответы были разделены на несколько столбцов для одного вопроса. Например, столбец Q1_1 = Полностью согласен для Q1, столбец Q1_5 = Совершенно не согласен. Таким образом, для каждого вопроса мы получили 5 столбцов ответов, если респондент ответил «Полностью согласен», связанная строка Q1_1 помечается как 1, где связанные строки Q1_2 - Q1_5 для этого респондента помечаются как 0.

Пожалуйста, кто-нибудь может поделиться решением для «агрегирования» ответов из нового инструмента опроса, чтобы вместо 5 столбцов для каждого вопроса у нас был бы один столбец для каждого вопроса со значением 1-5.

Я новичок в R, я думал, что R справится с этим вместо того, чтобы вручную изменять в Excel.

Пожалуйста, не публикуйте изображения кода/данных/ошибок: их нельзя копировать или искать (SEO), они ломают программы чтения с экрана и могут не подходить для некоторых мобильных устройств. Ссылка: meta.stackoverflow.com/a/285557 (и xkcd.com/2116). Просто включите код, вывод консоли или данные (например, data.frame(...) или вывод из dput(head(x))) напрямую.

r2evans 17.12.2020 15:02

Добро пожаловать в SO, Шон! Вопросы по SO (особенно в R) работают намного лучше, если они воспроизводимы и автономны. Под этим я подразумеваю включение попытки кода (пожалуйста, будьте явными в отношении небазовых пакетов), образцов репрезентативных данных (возможно, с помощью dput(head(x)) или построения данных программно (например, data.frame(...)), возможно, стохастически после set.seed(1)), возможно, фактического вывода (с дословными ошибками/предупреждениями). ) по сравнению с предполагаемым выходом. Ссылки: stackoverflow.com/q/5963269 , минимальный воспроизводимый пример и stackoverflow.com/tags/r/info.

r2evans 17.12.2020 15:02

Вы можете попробовать серию вложенных операторов ifelse(). ifelse(col_1 == 1, 1, ifelse(col_2 ==1, 2, ifelse(col_3 == 1, 3, ifelse(col_4 == 1, 4, 5))))

edsandorf 17.12.2020 15:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте этот подход изменить форму и в следующий раз следуйте совету @r2evans, так как нам нужно вводить данные. Вот код:

library(dplyr)
library(tidyr)
#Data
df <- data.frame(Respondent=paste0('Respondent',1:10),
                 Q6_1=c(1,0,1,1,1,1,0,0,0,1),
                 Q6_2=c(0,1,0,0,0,0,1,1,0,1),
                 Q6_3=rep(0,10),
                 Q6_4=c(rep(0,8),1,0),stringsAsFactors = F
                 )
#Code
new <- df %>% pivot_longer(-Respondent) %>%
  separate(name,c('variable','answer'),sep='_') %>%
  filter(value==1) %>%
  select(-value) %>%
  filter(!duplicated(Respondent)) %>%
  pivot_wider(names_from = variable,values_from=answer)

Выход:

# A tibble: 10 x 2
   Respondent   Q6   
   <chr>        <chr>
 1 Respondent1  1    
 2 Respondent2  2    
 3 Respondent3  1    
 4 Respondent4  1    
 5 Respondent5  1    
 6 Respondent6  1    
 7 Respondent7  2    
 8 Respondent8  2    
 9 Respondent9  4    
10 Respondent10 1 

Мне только любопытно, почему ваши данные в случае члена 10 имеют два значения 1. Может быть, опечатка или такое возможно?

Спасибо, это была опечатка для респондента10. Конечно, в следующий раз я постараюсь представить фрейм данных вместо скриншота.

Shawn 17.12.2020 16:36

@Шон Отлично! Рад помочь вам :) пожалуйста, в следующий раз используйте dput() для ваших вопросов. Иногда данные слишком велики, и мы можем их ввести :)

Duck 17.12.2020 16:37

Мы можем использовать data.table методы

library(data.table)
dcast(unique(melt(setDT(df), id.var = 'Respondent')[,
  c('variable', 'answer') := tstrsplit(variable, '_', 
   type.convert = TRUE)][value == 1], by = "Respondent"), 
    Respondent  ~ variable, value.var = 'answer')

-выход

#      Respondent Q6
# 1:  Respondent1  1
# 2: Respondent10  1
# 3:  Respondent2  2
# 4:  Respondent3  1
# 5:  Respondent4  1
# 6:  Respondent5  1
# 7:  Respondent6  1
# 8:  Respondent7  2
# 9:  Respondent8  2
#10:  Respondent9  4

данные

df <- structure(list(Respondent = c("Respondent1", "Respondent2", "Respondent3", 
"Respondent4", "Respondent5", "Respondent6", "Respondent7", "Respondent8", 
"Respondent9", "Respondent10"), Q6_1 = c(1, 0, 1, 1, 1, 1, 0, 
0, 0, 1), Q6_2 = c(0, 1, 0, 0, 0, 0, 1, 1, 0, 1), Q6_3 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0), Q6_4 = c(0, 0, 0, 0, 0, 0, 0, 0, 
1, 0)), class = "data.frame", row.names = c(NA, -10L))

Другие вопросы по теме