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

如何简便生成含百分比列的多组特定变量组合频数表?

生成带百分比的交叉频数表(R语言实现)

先确认我们的数据集:

set.seed(505)
df = data.frame(age_group = c(1,2,1,1,1,1,1,2,2,2,2,3,3,2,1,2,3),
                score = trunc(runif(17,0,5)),
                sex = trunc(runif(17,0,2)),
                FO1 = trunc(runif(17,0,2)),
                FN2 = trunc(runif(17,0,2)),
                AL3 = trunc(runif(17,0,2)),
                PM4 = trunc(runif(17,0,2)))

我们需要为FO1、FN2、AL3、PM4这几个变量,分别与age_group、score生成带百分比的交叉频数表,排除sex变量。下面提供两种实现方式:

方法一:基础R原生实现

先定义要组合的变量组,再循环生成所有组合的频数表及对应百分比:

# 定义待分析的变量组
target_vars <- c("FO1", "FN2", "AL3", "PM4")
cross_vars <- c("age_group", "score")

# 循环遍历所有变量组合,生成频数表和百分比
for (var in target_vars) {
  for (cross_var in cross_vars) {
    cat("\n=== ", var, "与", cross_var, "的交叉频数表 ===\n")
    # 基础频数表
    tbl <- table(df[[var]], df[[cross_var]])
    print(tbl)
    
    cat("\n行百分比(按", var, "分组,每行合计100%):\n")
    print(prop.table(tbl, margin = 1) * 100, digits = 2)
    
    cat("\n列百分比(按", cross_var, "分组,每列合计100%):\n")
    print(prop.table(tbl, margin = 2) * 100, digits = 2)
  }
}
  • prop.table(tbl, margin = 1):计算行百分比,以每个FO1/FN2等变量的分组为基准
  • prop.table(tbl, margin = 2):计算列百分比,以每个age_group/score的分组为基准
  • digits = 2:控制百分比保留两位小数

方法二:用janitor包生成美观的格式化表格

janitor包能快速生成带频数和百分比的交叉表,格式更规整:

# 安装并加载janitor包(首次使用需安装)
if (!require(janitor)) install.packages("janitor")
library(janitor)

# 循环生成所有变量组合的格式化交叉表
for (var in target_vars) {
  for (cross_var in cross_vars) {
    cat("\n=== ", var, "与", cross_var, "的交叉频数表(含百分比) ===\n")
    # 生成带行百分比的表格(频数+百分比)
    print(tabyl(df, !!sym(var), !!sym(cross_var)) %>% 
            adorn_percentages("row") %>% 
            adorn_pct_formatting(digits = 2) %>% 
            adorn_ns())
  }
}
  • 如果需要列百分比,把adorn_percentages("row")改成adorn_percentages("col")即可
  • adorn_ns():保留原始频数,让表格同时显示数量和百分比

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:05:34