You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于最差李克特等级排序gglikert图表并展示分组变量前n个类别的技术实现问询

基于最差李克特等级排序gglikert图表并展示分组变量前n个类别的技术实现问询

嘿,我来帮你搞定这个需求!我们要实现两个核心目标:一是只展示分组变量里出现频次最高的前n个类别,二是把三个李克特问题按照Strongly disagree(最差等级)的占比从高到低排序,最后用gglikert画出分面图。下面是一步步的实现过程:

第一步:准备数据并筛选分组前n个类别

首先完善你提供的数据生成代码,再筛选出分组变量var中出现次数最多的前n个类别(这里我设n=5,你可以按需调整):

# Load necessary libraries
library(tibble)
library(tidyverse)
library(ggplot2)
library(ggpubr)
library(ggstats)

# Define categories and Likert levels
var_levels <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q")

likert_levels <- c(
  "Strongly disagree",
  "Disagree",
  "Neither agree nor disagree",
  "Agree",
  "Strongly agree"
)

# Set seed for reproducibility
set.seed(42)

# Create the dataframe with three Likert response columns
df <- tibble(
  var = sample(var_levels, 50, replace = TRUE),  # Random values from A to Q
  val1 = sample(likert_levels, 50, replace = TRUE),
  val2 = sample(likert_levels, 50, replace = TRUE),
  val3 = sample(likert_levels, 50, replace = TRUE)
)

# 筛选分组变量var的前5个高频类别(n=5可调整)
top_n_groups <- df %>%
  count(var, sort = TRUE) %>%
  slice_head(n = 5) %>%
  pull(var)

df_filtered <- df %>%
  filter(var %in% top_n_groups)

第二步:整理数据并按最差等级排序问题

把数据转换成gglikert需要的长格式,再计算每个问题的Strongly disagree占比,以此为依据给问题排序:

# 转换为长格式,并指定李克特等级的顺序(保证图表顺序正确)
df_long <- df_filtered %>%
  pivot_longer(cols = starts_with("val"), names_to = "question", values_to = "response") %>%
  mutate(response = factor(response, levels = likert_levels))

# 计算每个问题的Strongly disagree占比,用于排序
question_order <- df_long %>%
  count(question, response) %>%
  group_by(question) %>%
  mutate(prop = n / sum(n)) %>%
  filter(response == "Strongly disagree") %>%
  arrange(desc(prop)) %>%
  pull(question)

# 把question列转换成按占比排序的因子
df_long <- df_long %>%
  mutate(question = factor(question, levels = question_order))

第三步:绘制分面的gglikert图表

用gglikert函数绘制图表,同时按分组变量var分面展示:

# 绘制分面gglikert图
gglikert(df_long, x = question, y = response, facet = var) +
  labs(title = "Likert Responses by Group (Top 5 Categories)",
       x = "Questions",
       y = "Response") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

最终生成的图表会完全符合你的需求:

  • 只展示分组变量中出现频次最高的前5个类别
  • 三个问题按照Strongly disagree的占比从高到低排列
  • 每个分组类别作为独立分面展示

如果要调整展示的分组数量,只需要修改slice_head(n = 5)里的数字即可!

备注:内容来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 13:39:50