Есть ли более чистый способ группировки и суммирования нескольких переменных несколькими способами в R? - PullRequest
0 голосов
/ 27 апреля 2020

Это мой первый пост. Извиняюсь, если я что-то испортил.

У меня есть данные опроса общественного мнения, которые имеют 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

Спасибо!

1 Ответ

1 голос
/ 27 апреля 2020

Если я правильно вас понимаю, это может сделать то, что вы ищете.

library(tidyverse)
)
survey %>%
  pivot_longer(cols = -department, names_to = "quality", values_to = "ranking") %>%
  group_by(department, quality) %>%
  summarise(mean_score = mean(ranking, na.rm = T)) %>%
  pivot_wider(names_from = quality, values_from = mean_score)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...