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

如何在SAS中将分类基线特征的分组统计结果合并为单表?

解决SAS中分类变量分组汇总表合并问题

你可以通过以下几种方法将多个PROC FREQ生成的单独表格合并为一个统一的汇总表,方便导出到报告:

方法1:使用PROC TABULATE直接生成合并表

PROC TABULATE能直接把所有分类变量按行排列,分组变量按列排列,输出统一的频数汇总表,语法简洁且适配报告需求:

proc tabulate data = clean.rand_tiny format=8.;
    class age_cat bmi4cat prev_preg prev_exposure periods_6m Trt_1 Trt_2;
    table (age_cat bmi4cat prev_preg prev_exposure periods_6m),
          (Trt_1 Trt_2) * N;
    keylabel N = "频数";
run;
  • class语句指定所有参与统计的分类变量;
  • table语句中,第一个括号内为行变量(你的基线特征),第二个括号内为列变量(分组变量),* N表示统计每组的频数;
  • keylabel可自定义统计量标签,让表格更易读。

方法2:使用PROC REPORT定制合并表

PROC REPORT灵活性更高,支持更多格式定制,适合需要调整表格样式的场景:

proc report data = clean.rand_tiny nowindows headline headskip;
    columns var_name var_value Trt_1 Trt_2;
    define var_name / group "基线特征";
    define var_value / group "类别";
    define Trt_1 / display "Trt_1 频数";
    define Trt_2 / display "Trt_2 频数";

    compute before var_name;
        line var_name $20.;
    endcomp;

    age_cat: compute var_name;
        var_name = "年龄分组";
    endcomp;
    age_cat: compute var_value;
        var_value = age_cat;
    endcomp;

    bmi4cat: compute var_name;
        var_name = "BMI分组";
    endcomp;
    bmi4cat: compute var_value;
        var_value = bmi4cat;
    endcomp;

    prev_preg: compute var_name;
        var_name = "既往妊娠史";
    endcomp;
    prev_preg: compute var_value;
        var_value = prev_preg;
    endcomp;

    prev_exposure: compute var_name;
        var_name = "既往暴露史";
    endcomp;
    prev_exposure: compute var_value;
        var_value = prev_exposure;
    endcomp;

    periods_6m: compute var_name;
        var_name = "6个月内周期数";
    endcomp;
    periods_6m: compute var_value;
        var_value = periods_6m;
    endcomp;

    break after var_name / skip;
run;
  • columns定义表格列结构,包含特征名称、特征类别、两个分组的频数;
  • 通过compute块为每个基线变量设置自定义名称,让表格更直观;
  • break after语句在每个基线特征后添加空行,提升可读性。

方法3:先导出PROC FREQ结果再整理

如果需要对统计结果做进一步加工,可以先用ODS OUTPUT把PROC FREQ的交叉表数据导出到数据集,再用DATA步或PROC TRANSPOSE合并:

步骤1:导出PROC FREQ结果

ods output crossfreq = freq_results;
proc freq data = clean.rand_tiny;
    tables (age_cat bmi4cat prev_preg prev_exposure periods_6m) * (Trt_1 Trt_2) / nopercent norow nocol;
run;
ods output close;
  • ods output crossfreq = freq_results将交叉表的统计结果保存到freq_results数据集。

步骤2:整理数据集为合并表

data merged_table;
    set freq_results;
    length var_name $30 var_value $20;
    /* 为每个变量设置自定义名称 */
    if Table = "age_cat" then var_name = "年龄分组";
    else if Table = "bmi4cat" then var_name = "BMI分组";
    else if Table = "prev_preg" then var_name = "既往妊娠史";
    else if Table = "prev_exposure" then var_name = "既往暴露史";
    else if Table = "periods_6m" then var_name = "6个月内周期数";
    /* 提取当前行的类别值 */
    var_value = coalescec(age_cat, bmi4cat, prev_preg, prev_exposure, periods_6m);
    /* 提取分组的频数 */
    if Trt_1 ne . then Trt_1_count = Count;
    if Trt_2 ne . then Trt_2_count = Count;
    keep var_name var_value Trt_1_count Trt_2_count;
run;

/* 合并同一特征类别的分组频数 */
proc sort data = merged_table;
    by var_name var_value;
run;

data final_table;
    merge merged_table(where=(Trt_1_count ne .)) merged_table(where=(Trt_2_count ne .));
    by var_name var_value;
run;
  • 先给每个原始变量设置易读名称,提取类别和对应频数;
  • 通过排序和合并,把同一类别下两个分组的频数放在同一行,形成最终汇总表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:38:36