SAS proc report如何实现两个by变量分类信息在报表顶部展示
SAS Proc Report双分组维度顶部展示实现方法
前置准备:数据集排序与预统计
首先需要对原始数据集按两个分组维度排序,同时预计算每个分组对应的统计值(比如分组样本量、剂量等你需要展示的信息),示例代码如下:
/* 1. 预计算双分组统计量 */ proc sql noprint; create table report_prepare as select a.*, b.gender_n, c.treat_n from 你的原始数据集 a /* 按第一个分组维度“性别”计算组内总样本量 */ left join (select 性别, count(*) as gender_n from 你的原始数据集 group by 性别) b on a.性别 = b.性别 /* 按两个分组维度联合计算细分组样本量 */ left join (select 性别, 治疗方案, 剂量, count(*) as treat_n from 你的原始数据集 group by 性别, 治疗方案, 剂量) c on a.性别 = c.性别 and a.治疗方案 = c.治疗方案 and a.剂量 = c.剂量 /* 按分组维度排序,必须和后续proc report的by变量顺序一致 */ order by 性别, 治疗方案, 剂量; quit;
核心配置:Proc Report分组头部输出
通过compute before _page_块实现两个by变量的分组信息在报表顶部渲染,核心用到SAS内置的#byval()关键字获取当前by组的变量值,示例代码如下:
proc report data=report_prepare nowindows headline headskip; /* 声明两个分组by变量,顺序要和前置排序的顺序一致 */ by 性别 治疗方案 剂量; /* 声明报表要展示的业务列 */ columns column1 column2 column3; /* 页首计算块,所有内容会输出在表头上方 */ compute before _page_ / left; line @1 "性别:" #byval(性别) " (" gender_n ")"; line @1 "治疗方案:" #byval(治疗方案) " (" #byval(剂量) "mg) " "(N=" treat_n ")"; line ""; /* 插入空行分隔分组信息和表头 */ endcomp; /* 这里可以加你自己的列格式、计算逻辑等原有配置 */ run;
关键说明
- #byval(变量名) 是SAS原生支持的by变量值获取关键字,你声明了几个by变量,就可以在line语句中调用对应变量的#byval,没有数量限制
- 如果不需要提前预计算统计量,也可以在proc report的columns里加入n统计项,直接在line语句中调用n变量输出当前组样本量
- 要确保by变量的顺序和数据集排序的顺序完全一致,否则会触发SAS报错
内容的提问来源于stack exchange,提问作者Inason
相关产品推荐
相关产品推荐

