SAS基于多列分组对指定列分别求和生成新表问题求助
SAS多列分组汇总问题解答
a 现有代码问题定位与修复
问题根因
最后一步PROC SQL左连接逻辑错误:汇总后的want表每个groupID仅对应1行结果,但关联的test1表每个groupID对应原分组的所有明细行,一对多匹配直接导致汇总结果重复,行数与原明细行数一致。
修复方法
仅需修改PROC SQL步骤,关联时取分类列的唯一值即可:
proc sql; create table test1_results as select distinct b.Col1,b.Col2,b.Col3,b.Col4, a.Col5,a.Col6 from want as a left join test1 as b on a.groupID = b.groupID; quit;
修改后输出结果即可保证每个分组仅1行。
b 简洁高效的实现方案
不需要自定义分组ID、多次转表,SAS原生支持多列直接作为分组键,以下是两种最优实现:
方案1:PROC SQL实现(代码最简,无需提前排序)
适合中小数据量,逻辑直观易理解:
proc sql; create table Final_table as select Col1, Col2, Col3, Col4, sum(Col5) as Col5 format=best32., sum(Col6) as Col6 format=best32. from XXX group by Col1, Col2, Col3, Col4; quit;
方案2:PROC SUMMARY实现(大数据量下性能更优)
处理百万级以上数据时效率远高于SQL,无需提前排序:
proc summary data=XXX nway; /* 指定分组列 */ class Col1 Col2 Col3 Col4; /* 指定需要求和的数值列 */ var Col5 Col6; /* 输出汇总结果,sum=后直接写列名即可保持原列名 */ output out=Final_table sum=Col5 Col6; run;
说明:
nway参数的作用是仅输出所有class列完全一致的分组汇总结果,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者uwd
相关产品推荐
相关产品推荐

