如何用SAS Proc SQL生成排除零值的均值变量且保留零值记录
问题描述
现有数据集包含5个变量:Academic_year、dept、InstrGID、curenr、credit_hours,需求如下:
- 按
Academic_year、dept、InstrGID分组计算credit_hours的均值 - 计算均值时需排除
curenr=0对应的记录 - 最终数据集必须保留所有原始记录(包括
curenr=0的行)
当前使用的PROC SQL脚本会过滤掉curenr=0的记录,无法满足保留全部行的要求,示例数据集和当前脚本如下:
示例数据集
| Academicyear | Dept | INSTRGID | curenr | Credit_hours | mean_credit_hours |
|---|---|---|---|---|---|
| 2022 | CS | G11111111 | 10 | 20 | 25 |
| 2022 | CS | G11111111 | 10 | 30 | 25 |
| 2023 | GDA | G11111111 | 20 | 10 | 50 |
| 2023 | GDA | G11111111 | 20 | 90 | 50 |
| 2023 | GDA | G22222222 | 0 | 0 | - |
| 2023 | GDA | G22222222 | 20 | 30 | 35 |
| 2023 | GDA | G22222222 | 20 | 40 | 35 |
当前脚本
proc sql; create table avg_cred_hrs as select *, mean(Credit_Hours) as mean_credit_hours from work.QUERY_FOR_XLSTCOUNT where CURENR >0 group by AcademicYear, dept , INSTRGID; quit;
解决方案
方法1:PROC SQL 条件均值+左连接
先单独计算符合条件的分组均值,再通过左连接将均值匹配回原始数据集,确保所有原始记录被保留:
proc sql; create table avg_cred_hrs as select a.*, b.mean_credit_hours from work.QUERY_FOR_XLSTCOUNT as a left join ( -- 子查询仅计算curenr>0的分组均值 select AcademicYear, dept, INSTRGID, mean(Credit_Hours) as mean_credit_hours from work.QUERY_FOR_XLSTCOUNT where CURENR > 0 group by AcademicYear, dept, INSTRGID ) as b on a.AcademicYear = b.AcademicYear and a.dept = b.dept and a.INSTRGID = b.INSTRGID; quit;
- 子查询负责生成过滤后的分组均值
- 左连接保证原始数据的所有行都被保留,
curenr=0的行对应的均值会显示为缺失值(对应示例中的-)
方法2:DATA步 + PROC MEANS
先用PROC MEANS计算分组均值,再通过合并操作将均值关联到原始数据:
-- 生成仅含分组和均值的临时数据集 proc means data=work.QUERY_FOR_XLSTCOUNT noprint; where CURENR > 0; class AcademicYear dept INSTRGID; var Credit_Hours; output out=mean_data mean=mean_credit_hours; run; -- 合并均值到原始数据集,保留所有原始记录 data avg_cred_hrs; merge work.QUERY_FOR_XLSTCOUNT mean_data(keep=AcademicYear dept INSTRGID mean_credit_hours); by AcademicYear dept INSTRGID; run;
- PROC MEANS生成精简的均值统计结果
- MERGE语句按分组变量匹配,自动保留原始全部行,无对应均值的行将显示缺失值
内容的提问来源于stack exchange,提问作者Elizabeth
相关产品推荐
相关产品推荐

