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

