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

分类变量水平分栏时的柱状图绘制及组间p值计算问询

问题1:绘制含百分比的柱状图

首先修正数据集的拼写错误(原代码中grou3应为group3),再将宽格式数据转换为长格式,计算每个Age水平下各组的占比,最后用ggplot2绘制带百分比标签的柱状图:

# 修正并创建数据集
Age <- c(1, 2, 3, 4)
group1 <- c(22, 23, 24, 44)
group2 <- c(34, 35, 36, 66)
group3 <- c(44, 55, 66, 67)
A <- data.frame(Age, group1, group2, group3)

# 加载tidyverse工具包(包含dplyr和ggplot2)
library(tidyverse)

# 转换为长格式并计算每个Age下的组占比
A_long <- A %>%
  pivot_longer(cols = starts_with("group"), names_to = "Group", values_to = "Count") %>%
  group_by(Age) %>%
  mutate(Percentage = Count / sum(Count) * 100) %>%
  ungroup()

# 绘制柱状图
ggplot(A_long, aes(x = factor(Age), y = Percentage, fill = Group)) +
  geom_col(position = "dodge") +  # 分组并排柱状图
  geom_text(
    aes(label = sprintf("%.1f%%", Percentage)),
    position = position_dodge(width = 0.9),
    vjust = -0.5  # 标签在柱子上方
  ) +
  labs(x = "Age水平", y = "百分比", title = "各Age水平下各组占比") +
  theme_minimal()

说明:代码先将宽格式数据转为ggplot易处理的长格式,计算每个Age水平下各组数值占该Age总和的百分比,最终生成带百分比标签的分组柱状图,标签保留1位小数。


问题2:组间比较的p值计算

根据你给出的示例,分两种常见场景处理:

场景1:比较三个组的组内Age占比分布差异

即把每个组的数值转换为该组内的Age占比(比如group1中22/(22+23+24+44)*100),再比较三个组的占比分布是否有显著差异:

# 计算每个组内各Age的占比
A_group_pct <- A %>%
  mutate(
    across(
      starts_with("group"),
      ~ .x / sum(.x) * 100,
      .names = "{col}_pct"  # 新列名加_pct后缀
    )
  ) %>%
  select(Age, ends_with("_pct"))

# 转换为长格式用于统计检验
A_group_pct_long <- A_group_pct %>%
  pivot_longer(
    cols = ends_with("_pct"),
    names_to = "Group",
    values_to = "Percentage"
  ) %>%
  mutate(Group = str_remove(Group, "_pct"))  # 去掉_pct后缀

# 单因素方差分析(比较三组占比的整体差异)
anova_result <- aov(Percentage ~ Group, data = A_group_pct_long)
summary(anova_result)

# 若方差分析显著,用TukeyHSD做两两比较
TukeyHSD(anova_result)

说明:方差分析结果中,Pr(>F)即为组间整体差异的p值;若该p值小于0.05,说明三组占比分布存在显著差异,此时用TukeyHSD可得到两两组之间的比较p值。

场景2:针对每个Age水平,比较三个组的数值差异

即对每个Age(比如Age=1时的22、34、44),单独计算三个组之间的差异p值:

# 转换为长格式
A_long <- A %>%
  pivot_longer(cols = starts_with("group"), names_to = "Group", values_to = "Count")

# 按Age分组,计算每个Age下的组间比较p值
age_p_values <- A_long %>%
  group_by(Age) %>%
  summarize(
    p_value = summary(aov(Count ~ Group, data = cur_data()))[[1]][["Pr(>F)"]][1],
    .groups = "drop"
  )

# 查看结果
age_p_values

说明:这段代码会输出每个Age对应的组间方差分析p值,可直接看到每个Age水平下三组数值是否存在显著差异。


内容的提问来源于stack exchange,提问作者ElR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:45:46