SAS中按年份为州级数据添加USA汇总层级的实现方法
需求:为州级数据添加全国(USA)汇总层级
我正在处理州级数据,希望在现有州级数据中添加汇总的"USA"层级。每个州拥有约10年的数据,需保持"USA"层级按年份统计的格式。
示例输入数据
data test; input State$ year count1 count2; datalines; MA 2010 33 34 MA 2011 54 32 MA 2012 45 43 MA 2013 49 50 LA 2010 29 29 LA 2011 32 34 LA 2012 34 44 LA 2013 44 45 WV 2010 33 34 WV 2011 34 37 WV 2012 44 43 WV 2013 33 35 ; run;
期望输出格式
data test_2; input State$ year count1 count2; datalines; MA 2010 33 34 MA 2011 54 32 MA 2012 45 43 MA 2013 49 50 LA 2010 29 29 LA 2011 32 34 LA 2012 34 44 LA 2013 44 45 WV 2010 33 34 WV 2011 34 37 WV 2012 44 43 WV 2013 33 35 USA 2010 95 97 USA 2011 120 103 USA 2012 121 130 USA 2013 126 130 ; run;
简便实现方法
方法1:PROC SUMMARY分步合并
用PROC SUMMARY按年份计算全国总和,再和原始数据合并,步骤清晰易维护:
/* 生成每年的全国汇总数据 */ proc summary data=test nway; class year; var count1 count2; output out=usa_sum (drop=_type_ _freq_) sum=; run; /* 添加USA标识并对齐变量名 */ data usa_sum; set usa_sum; State = 'USA'; run; /* 合并原始数据和汇总数据 */ data test_2; set test usa_sum; run;
方法2:PROC SUMMARY一步生成目标数据集
利用_type_变量同时保留明细行和汇总行,无需额外合并步骤:
proc summary data=test; class State year; var count1 count2; /* _type_=3 是州+年份的明细行,_type_=1 是仅年份的全国汇总行 */ output out=test_2 (where=(_type_ in (1,3)) drop=_freq_) sum=; run; /* 把汇总行的State字段替换为USA */ data test_2; set test_2; if _type_ = 1 then State = 'USA'; drop _type_; run;
方法3:DATA步循环汇总
适合习惯用DATA步的场景,通过循环累加实现年份汇总:
/* 计算每年的全国总和 */ data usa_sum; do until(last.year); set test; by year; total1 + count1; total2 + count2; end; State = 'USA'; count1 = total1; count2 = total2; keep State year count1 count2; /* 重置累加变量,处理下一年 */ total1 = 0; total2 = 0; run; /* 合并原始数据和汇总数据 */ data test_2; set test usa_sum; run;
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

