在R中使用gglikert时,如何传递多分组类别绘制Likert图表?
如何用gglikert绘制多分组的Likert图表
问题描述
我有一个数据框,包含3列Likert等级值和1列含多个类别的分组列(演示用A-Z,实际为复杂字符值)。想把所有分组类别传入gglikert函数的对应位置,绘制Likert图表,原代码如下:
library(dplyr) library(tidyr) library(ggstats) set.seed(123) likert_levels <- c( "1" = "Very Dissatisfied", "2" = "Dissatisfied", "3" = "Neutral", "4" = "Satisfied", "5" = "Very Satisfied") df = data.frame( var = sample(LETTERS, 50, replace = TRUE), A = sample(likert_levels, 50, replace = TRUE), B = sample(likert_levels, 50, replace = TRUE), C = sample(likert_levels, 50, replace = TRUE))%>% mutate(across(everything(),as.factor))%>% as_tibble()%>% mutate(across(-var, ~ factor(.x, levels = likert_levels))) mutate(df, id=row_number()) %>% pivot_longer(-c(id, var), names_to="group") %>% pivot_wider(names_from=var)%>% ggstats::gglikert( "?", facet_rows=vars(group))
解决方案
你可以利用tidyselect语法,直接选中所有分组类别列(即除id和group之外的所有列)替代原代码中的"?"。使用everything(-id, -group)能自动选中所有目标列,无需手动逐个输入列名,尤其适配实际数据中分组类别为复杂字符值的场景。
修改后的完整代码:
library(dplyr) library(tidyr) library(ggstats) set.seed(123) likert_levels <- c( "1" = "Very Dissatisfied", "2" = "Dissatisfied", "3" = "Neutral", "4" = "Satisfied", "5" = "Very Satisfied") df = data.frame( var = sample(LETTERS, 50, replace = TRUE), A = sample(likert_levels, 50, replace = TRUE), B = sample(likert_levels, 50, replace = TRUE), C = sample(likert_levels, 50, replace = TRUE))%>% mutate(across(everything(),as.factor))%>% as_tibble()%>% mutate(across(-var, ~ factor(.x, levels = likert_levels))) mutate(df, id=row_number()) %>% pivot_longer(-c(id, var), names_to="group") %>% pivot_wider(names_from=var)%>% ggstats::gglikert(everything(-id, -group), facet_rows=vars(group))
关键说明
everything(-id, -group):everything()会选中所有列,-id, -group用来排除不需要的辅助列,精准定位到所有分组类别列(A-Z)。- 这样修改后,不管实际数据中的分组类别数量多少、字符值复杂度如何,都能自动传入gglikert函数,生成对应的Likert图表。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

