Мы часто задаем масштабные вопросы в наших социальных опросах; респонденты выражают свое согласие с нашим утверждением (полностью согласен, согласен, ни то, ни другое, не согласен, совершенно не согласен). Результаты опроса обычно представляются в агрегированном формате, т. е. для каждого вопроса (переменной) ответы представлены в одном столбце, где 5 = полностью согласен, 1 = полностью не согласен и т. д.
Теперь мы столкнулись с новым инструментом опроса, где ответы были разделены на несколько столбцов для одного вопроса. Например, столбец Q1_1 = Полностью согласен для Q1, столбец Q1_5 = Совершенно не согласен. Таким образом, для каждого вопроса мы получили 5 столбцов ответов, если респондент ответил «Полностью согласен», связанная строка Q1_1 помечается как 1, где связанные строки Q1_2 - Q1_5 для этого респондента помечаются как 0.
Пожалуйста, кто-нибудь может поделиться решением для «агрегирования» ответов из нового инструмента опроса, чтобы вместо 5 столбцов для каждого вопроса у нас был бы один столбец для каждого вопроса со значением 1-5.
Я новичок в R, я думал, что R справится с этим вместо того, чтобы вручную изменять в Excel.
Добро пожаловать в SO, Шон! Вопросы по SO (особенно в R) работают намного лучше, если они воспроизводимы и автономны. Под этим я подразумеваю включение попытки кода (пожалуйста, будьте явными в отношении небазовых пакетов), образцов репрезентативных данных (возможно, с помощью dput(head(x))
или построения данных программно (например, data.frame(...)
), возможно, стохастически после set.seed(1)
), возможно, фактического вывода (с дословными ошибками/предупреждениями). ) по сравнению с предполагаемым выходом. Ссылки: stackoverflow.com/q/5963269 , минимальный воспроизводимый пример и stackoverflow.com/tags/r/info.
Вы можете попробовать серию вложенных операторов ifelse()
. ifelse(col_1 == 1, 1, ifelse(col_2 ==1, 2, ifelse(col_3 == 1, 3, ifelse(col_4 == 1, 4, 5))))
Попробуйте этот подход изменить форму и в следующий раз следуйте совету @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. Конечно, в следующий раз я постараюсь представить фрейм данных вместо скриншота.
@Шон Отлично! Рад помочь вам :) пожалуйста, в следующий раз используйте dput()
для ваших вопросов. Иногда данные слишком велики, и мы можем их ввести :)
Мы можем использовать 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))
Пожалуйста, не публикуйте изображения кода/данных/ошибок: их нельзя копировать или искать (SEO), они ломают программы чтения с экрана и могут не подходить для некоторых мобильных устройств. Ссылка: meta.stackoverflow.com/a/285557 (и xkcd.com/2116). Просто включите код, вывод консоли или данные (например,
data.frame(...)
или вывод изdput(head(x))
) напрямую.