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

R语言按分组变量统计分类变量频数并绘制对应直方图

R实现分类变量分组频数统计与绘图

前置准备

首先加载测试数据,修正列名匹配描述中的Var1、Var2:

test_df <- structure(list(`1` = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), `2` = c(3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2)), row.names = c(NA, -101L), class = c("tbl_df", "tbl", 
"data.frame"))
# 重命名列
colnames(test_df) <- c("Var1", "Var2")

1. 生成分组频数表

基础R实现

直接用table()函数生成列联表,行对应Var2取值,列对应Var1取值,单元格为对应频次:

# 基础频数表,仅展示数据中存在的分类
freq_table <- table(Var2 = test_df$Var2, Var1 = test_df$Var1)
freq_table

测试数据运行结果:

Var1
Var2  1  2
   2 24 70
   3  0  7

如果需要强制展示1、2、3所有分类水平(即使数据中没有出现、频次为0),先把两个变量转为因子并指定完整水平:

# 指定因子水平
test_df$Var1 <- factor(test_df$Var1, levels = c(1,2,3))
test_df$Var2 <- factor(test_df$Var2, levels = c(1,2,3))
# 生成完整频数表
freq_table_full <- table(Var2 = test_df$Var2, Var1 = test_df$Var1)
freq_table_full

运行结果:

Var1
Var2  1  2  3
   1  0  0  0
   2 24 70  0
   3  0  7  0

2. 绘制分组频数图

注意:分类变量的频数统计适合用分组柱状图,直方图默认用于连续变量分箱统计,这里用ggplot2实现需求:x轴为Var2的分类值,y轴为频数,同Var2分组下区分不同Var1的频数:

# 加载ggplot2,未安装先运行 install.packages("ggplot2")
library(ggplot2)

ggplot(test_df, aes(x = Var2, fill = Var1)) +
  geom_bar(position = position_dodge(preserve = "single"), width = 0.7) +
  labs(
    x = "Var2状态值",
    y = "频数",
    fill = "Var1状态值",
    title = "Var2分组下Var1各状态频数分布"
  ) +
  scale_y_continuous(expand = c(0,0)) +
  theme_bw()

参数说明:

  • position_dodge(preserve = "single"):保证同x轴位置的不同Var1柱子并列展示,且即使某分类频数为0也会保留对应柱子位置
  • 如果需要堆叠展示不同Var1的频数,把geom_bar()的position参数改为position = "stack"即可
  • scale_y_continuous(expand = c(0,0)):让y轴从0开始,柱子底部和x轴无空隙
  • 运行后直接输出绘图结果,匹配要求的展示逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:39:15