首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中,有没有一种更清晰的方式来对多个变量进行分组和汇总?

在R中,有没有一种更清晰的方式来对多个变量进行分组和汇总?
EN

Stack Overflow用户
提问于 2020-04-27 09:24:53
回答 1查看 61关注 0票数 0

这是我的第一篇文章。如果我搞砸了很抱歉。

我有员工意见调查数据,其中有5点likert量表数据以及部门(和其他人口统计数据)。我希望得到%不利(1或2个调查响应)、%中性(调查响应== 3)和%有利(4或5响应)。我还希望每个部门都有这些%s。我用下面的样本数据得到了我想要的结果,但实际上我有30+变量。我希望有一种更干净的方法来做这件事!

以下是我的示例数据:

代码语言:javascript
复制
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))

使用下面的代码,我可以很容易地获得%的好评:

代码语言:javascript
复制
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个计算(%unfav、%neutral和%fav),它就开始变得混乱。有没有比这更好的方法(它确实给了我想要的输出--再说一次,考虑到我实际上有30+变量,它的可扩展性不是很好):

代码语言:javascript
复制
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 satisfaction_fav leadership_fav pride_neut satisfaction_neut leadership_neut pride_unfav satisfaction_unfav leadership_unfav

第2行: hr 0.75 0.5 0.25 0 0 0 0.25 0.5 0.75

第3行: tech 0 0.25 0.4 0.5 0.75 0.4 0.5 0 0.2

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-04-27 23:09:41

如果我没理解错的话,这可能就是你想要的。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61450336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档