如何在SAS中计算最后5年的均值(排除缺失值)
在SAS中计算最后5年均值并添加汇总行
原始数据集
Year Dv1 Dv2 Dv3 Dv4 2014 1 1 2 5 2015 3 4 8 8 2016 2 5 9 11 2017 4 4 5 9 2018 2 6 7 9 2019 2 4 6 . 2020 1 3 . . 2021 3 . . .
需求说明
计算各数值列(Dv1-Dv4)最后5年的均值(自动排除缺失值),并在数据集末尾添加一行标记为Avg5的汇总行,最终结果如下:
Year Dv1 Dv2 Dv3 Dv4 2014 1 1 2 5 2015 3 4 8 8 2016 2 5 9 11 2017 4 4 5 9 2018 2 6 7 9 2019 2 4 6 . 2020 1 3 . . 2021 3 . . . Avg5 2.4 4.4 7 8.4
SAS实现方案
可以通过PROC SQL结合数据步,或者PROC MEANS的方式实现,以下是两种实用方案:
方案1:直接取最新5行计算均值(适合数据已按年份升序排列)
/* 1. 计算最后5年的均值 */ proc sql noprint; create table avg_stats as select 'Avg5' as Year label='Year', mean(Dv1) as Dv1 format=1.1, mean(Dv2) as Dv2 format=1.1, mean(Dv3) as Dv3 format=1.0, mean(Dv4) as Dv4 format=1.1 from (select * from have order by Year desc limit 5); /* 取最新5行数据 */ quit; /* 2. 合并原数据集与汇总行 */ data want; set have avg_stats; run;
方案2:按年份范围筛选计算(数据乱序也适用)
如果数据集未按年份排序,可通过年份范围精准筛选最后5年:
/* 1. 获取最新年份,计算最后5年的起始年份 */ proc sql noprint; select max(Year) into :max_year from have; quit; %let start_year = %eval(&max_year - 4); /* 2. 计算指定年份范围的均值 */ proc means data=have noprint; where Year >= &start_year; var Dv1-Dv4; output out=avg_stats(drop=_type_ _freq_) mean= / autoname; run; /* 3. 整理汇总行格式 */ data avg_stats; set avg_stats; Year = 'Avg5'; rename Dv1_Mean=Dv1 Dv2_Mean=Dv2 Dv3_Mean=Dv3 Dv4_Mean=Dv4; format Dv1-Dv4 1.1; run; /* 4. 合并数据集 */ data want; set have avg_stats; run;
关键说明
- SAS的
mean()函数会自动忽略缺失值(.)计算均值,无需额外处理。 - 通过
format语句可控制均值的小数位数,匹配预期结果的格式。 - 方案1简洁高效,适合数据有序的场景;方案2更严谨,适配数据乱序的情况。
内容的提问来源于stack exchange,提问作者RDJ
相关产品推荐
相关产品推荐

