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

如何用R统计多变量各值出现次数并生成占比表(类Stata tabout)

使用data.table生成频次与占比统计表格

原始数据集与代码

# 加载依赖包
library(data.table)
library(expss)
library(sjlabelled) # 用于调用as_label()函数

# 创建data.table数据集
a <- data.table("b1" = c(1, 2, 2, 2),  
                "b2" = c(1, 2, 1, 1),
                "b3" = c(1, 1, 1, 1))

# 设置值标签并转换为文本标签
val_lab(a) = num_lab("
            1 Yes
            2 No    
")
a = as_label(a)

转换标签后的数据集展示:

> a
    b1  b2  b3
1: Yes Yes Yes
2:  No  No Yes
3:  No Yes Yes
4:  No Yes Yes

需求说明

需要生成两类统计表格:

  • 各变量不同取值的出现频次表
  • 各变量不同取值的占比表(效果类似Stata的tabout命令)

1. 生成频次统计表格

通过melt将宽表转为长表,再用dcast汇总频次,自动补全缺失类别的0值:

# 宽表转长表
a_long <- melt(a, measure.vars = names(a), variable.name = "变量名", value.name = "类别")
# 按类别汇总各变量频次
freq_table <- dcast(a_long, 类别 ~ 变量名, fun.aggregate = length, fill = 0)
# 调整列顺序,将类别列放在首位
setcolorder(freq_table, c("类别", names(a)))
freq_table

输出结果:

类别 b1 b2 b3
1: Yes  1  3  4
2:  No  3  1  0

2. 生成占比统计表格

基于频次表计算各取值的占比,再添加合计行:

# 计算各列占比(转为百分比并保留整数)
pct_table <- freq_table[, lapply(.SD, function(x) round(x / sum(x) * 100)), 
                       .SDcols = names(a), by = 类别]
# 添加合计行
pct_table <- rbind(pct_table, data.table(类别 = "合计", t(colSums(freq_table[, names(a), with = FALSE]))))
pct_table

输出结果:

类别  b1  b2  b3
1: Yes  25  75 100
2:  No  75  25   0
3: 合计 100 100 100

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:02:29