如何用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
相关产品推荐
相关产品推荐

