如何用PROC SUMMARY/PROC MEANS在SAS中计算COUNTRY组内SALARY_GROUP相对频率?
用PROC SUMMARY/MEANS实现组内相对频率计算
完全可以!PROC SUMMARY是处理这类分组相对频率统计的绝佳工具,PROC MEANS也能实现,但PROC SUMMARY在汇总类任务上更灵活直接。我给你两种实用的实现方式:
方法一:分步计算(清晰易懂)
这个方法先拆分出组内频数和国家总频数,再计算相对频率,逻辑非常直观:
/* 第一步:计算每个COUNTRY×SALARY_GROUP组合的观测数 */ proc summary data=your_dataset nway missing; class COUNTRY SALARY_GROUP; /* 指定分组变量和分类变量 */ output out=group_counts(rename=(_freq_=group_count)) n=; /* 输出频数并重命名 */ run; /* 第二步:计算每个COUNTRY的总观测数 */ proc summary data=group_counts nway; class COUNTRY; var group_count; output out=country_totals(rename=(group_count=country_total)) sum=; /* 求和得到国家总人数 */ run; /* 第三步:合并数据集并计算相对频率 */ data salary_relative_freq; merge group_counts country_totals; by COUNTRY; relative_freq = group_count / country_total; /* 组内频数/国家总频数 */ format relative_freq percent8.1; /* 格式化为百分比,方便查看 */ run;
代码细节解释:
nway选项:只输出最细粒度的分组结果(也就是每个国家下的每个薪资组),避免生成冗余的层级汇总数据。missing选项:如果你的数据里存在缺失值(比如COUNTRY或SALARY_GROUP为空),会把缺失值当作一个独立类别统计,不需要的话可以直接去掉这个选项。- 最后用
format把相对频率转成百分比格式,可读性会强很多。
方法二:更简洁的合并写法
如果想少写一步,可以直接在第一个PROC SUMMARY里保留所有层级的汇总,然后通过数据步筛选计算:
proc summary data=your_dataset missing; class COUNTRY SALARY_GROUP; output out=all_counts(rename=(_freq_=count)) n=; run; data salary_relative_freq; set all_counts; by COUNTRY; /* 保留最细分组(SALARY_GROUP非缺失),并获取当前国家的总频数 */ if not missing(SALARY_GROUP) then do; retain country_total; if first.COUNTRY then country_total = count; /* 每个国家的第一条记录是总频数 */ relative_freq = count / country_total; format relative_freq percent8.1; output; end; run;
关于PROC MEANS的说明
PROC MEANS和PROC SUMMARY本质是“双胞胎”工具,只是默认输出不同。把上面代码里的proc summary换成proc means noprint就能得到同样的结果——noprint是为了避免输出默认的描述性统计表格,只保留我们需要的输出数据集。比如:
proc means data=your_dataset noprint nway missing; class COUNTRY SALARY_GROUP; output out=group_counts(rename=(_freq_=group_count)) n=; run;
小补充
如果只是想快速查看结果,其实PROC FREQ也能直接输出组内相对频率(用by COUNTRY; tables SALARY_GROUP / row;),但既然你指定要用PROC SUMMARY/MEANS,上面的方法完全能满足需求。
内容的提问来源于stack exchange,提问作者Giorgio Spedicato
相关产品推荐
相关产品推荐

