如何在SAS中按组汇总观测值?附分组求均值及PROC TABULATE使用疑问
嘿,我来帮你搞定这个SAS分组求平均的问题!首先得先修正下你的数据集输入——原代码里的cards数据是成对的match和percent,但默认input只会读一次变量,所以得加上@@让SAS循环读取直到数据行结束,不然会读错观测哦。
修正后的数据集代码
data have; input match percent @@; cards; 0 34 0 54 0 33 0 23 1 60 1 70 1 70 1 70 ; run;
接下来给你介绍几种按组汇总求平均的方法,包括你提到的PROC TABULATE:
方法1:用PROC TABULATE生成格式化报表
PROC TABULATE擅长生成结构化的统计报表,按组求平均的写法如下:
proc tabulate data=have; class match; /* 指定分组变量 */ var percent; /* 指定要计算的数值变量 */ /* 表格结构:行是分组变量,列是percent的均值 */ table match, percent*mean / box='Match Group'; /* 给分组列添加标题美化输出 */ run;
运行后会输出一个清晰的表格,直接展示每个match组对应的percent平均值,和你手动计算的(34+54+33+23)/4、(60+70+70+70)/4结果完全一致。
方法2:用PROC MEANS快速做分组统计
这是SAS里最常用的汇总工具,语法简洁,还能同时输出观测数等额外统计量:
proc means data=have mean n; /* mean=计算均值,n=统计每组观测数 */ class match; /* 按match分组 */ var percent; /* 对percent计算统计量 */ run;
如果想把结果保存到数据集里,可以加output out=mean_result mean=avg_percent;参数,后续方便调用。
方法3:用PROC SQL灵活实现分组逻辑
如果你熟悉SQL语法,这种方式更直观,完全贴合你“求和除以个数”的手动逻辑:
proc sql; select match, avg(percent) as avg_percent format=6.2, /* 计算均值并指定显示格式 */ count(*) as obs_count /* 统计每组的观测个数 */ from have group by match; /* 按match分组计算 */ quit;
运行后会直接输出分组后的均值和观测数,结果一目了然。
方法4:DATA步手动控制分组计算
如果需要自定义更复杂的汇总逻辑,比如先存总和再计算均值,可以用DATA步配合BY语句:
/* 先按分组变量排序,BY语句要求数据集有序 */ proc sort data=have; by match; run; data mean_result; set have; by match; /* 每组第一个观测时,初始化求和变量和计数 */ if first.match then do; total_percent = 0; obs_num = 0; end; total_percent + percent; /* 累加每组的percent总和 */ obs_num + 1; /* 统计每组的观测数 */ /* 每组最后一个观测时,计算均值并输出 */ if last.match then do; avg_percent = total_percent / obs_num; output; keep match total_percent obs_num avg_percent; /* 只保留需要的变量 */ end; run;
这里的first.match和last.match是BY语句自动生成的标志,分别标记每组的第一个和最后一个观测,用来控制累加和计算的时机。
内容的提问来源于stack exchange,提问作者Nathan123
相关产品推荐
相关产品推荐

