Это мой первый пост. Извиняюсь, если я что-то испортил.
У меня есть данные опроса общественного мнения, которые имеют 5-балльную шкалу Лайкерта вместе с отделом (и другие демографические данные c). Я хотел бы получить% неблагоприятного (1 или 2 ответа на опрос),% нейтрального (ответ на опрос == 3) и% благоприятного (4 или 5 ответа). Я также хотел бы иметь эти% s для каждого отдела. У меня есть результат, который я ищу с примерами данных ниже, но у меня на самом деле есть более 30 переменных. Я надеюсь, что есть более чистый способ сделать это!
Вот мои примеры данных:
survey <- data.frame(department = c('hr', 'hr', 'tech', 'tech', 'tech', 'hr', 'hr', 'tech', 'tech', 'tech'),
pride = c(1, 5, 2, 3, NA, 5, 5, 2, 3, NA),
satisfaction = c(5, 2, 3, NA, 5, 5, 2, 3, NA, 3),
leadership = c(5, 2, 3, NA, 5, 1, 1, 5, 2, 3))
Я могу довольно легко получить% благоприятный, используя это:
items <- c('pride', 'satisfaction', 'leadership')
output <- survey %>%
group_by(department) %>%
mutate_at(items, recode, `1` = 0, `2` = 0, `3` = 0, `4` = 1, `5` = 1) %>%
summarize_at(items, mean, na.rm = T) %>%
rowwise() %>%
mutate(engagement = mean(c(pride,satisfaction,leadership), na.rm = T)) %>%
filter(!is.na(department))
Становится беспорядочным, когда я пытаюсь выполнить все 3 вычисления (% недопустимо,% нейтрально и% fav). Есть ли лучший способ, чем этот (который дает мне желаемый результат - опять же, он не очень масштабируемый, учитывая, что у меня на самом деле более 30 переменных):
items_fav <- c('pride_fav', 'satisfaction_fav', 'leadership_fav')
items_neutral <- c('pride_neut', 'satisfaction_neut', 'leadership_neut')
items_unfav <- c('pride_unfav', 'satisfaction_unfav', 'leadership_unfav')
all_items <- (c('pride_fav', 'satisfaction_fav', 'leadership_fav','pride_neut', 'satisfaction_neut', 'leadership_neut','pride_unfav', 'satisfaction_unfav', 'leadership_unfav'))
output_3parts <- survey %>%
mutate(pride_fav = pride,
satisfaction_fav = satisfaction,
leadership_fav = leadership,
pride_neut = pride,
satisfaction_neut = satisfaction,
leadership_neut = leadership,
pride_unfav = pride,
satisfaction_unfav = satisfaction,
leadership_unfav = leadership) %>%
mutate_at(items_fav, recode, `1` = 0, `2` = 0, `3` = 0, `4` = 1, `5` = 1) %>%
mutate_at(items_neutral, recode, `1` = 0, `2` = 0, `3` = 1, `4` = 0, `5` = 0) %>%
mutate_at(items_unfav, recode, `1` = 1, `2` = 1, `3` = 0, `4` = 0, `5` = 0) %>%
group_by(department) %>%
summarize_at(all_items, mean , na.rm = T)
Вывод будет выглядеть примерно так:
Строка 1: отдел pride_fav удовлетворение_fav руководство_fav pride_neut удовлетворение_neut руководство_neut pride_unfav удовлетворение_unfav руководстве_unfav
Строка 2: час 0,75 0,5 0,25 0 0 0 0,25 0,5 0,75
Строка 3: технология 0 0,25 0,4 0,5 0,7 0,5 0 0,2
Спасибо!