求等价于Proc SQL的SAS代码:统计各id对应的唯一(id,k)对数
用Base SAS实现与Proc SQL相同的统计结果
原Proc SQL代码的作用是按id分组,统计每个id下唯一的id+k组合的数量(由于按id分组,每组内id固定,实际等价于统计每个id下不同k值的个数),以下是几种适合初级用户的Base SAS实现方法:
方法一:先去重再统计(步骤清晰)
先通过排序去除重复的id+k组合,再统计每个id的行数:
/* 1. 按id和k排序,保留唯一组合 */ proc sort data=example1 nodupkey; by id k; run; /* 2. 统计每个id的行数,得到counter */ proc freq data=example1 noprint; tables id / out=result(keep=id count rename=(count=counter)); run; /* 查看结果 */ proc print data=result; run;
方法二:用Proc Summary一步式实现
通过两次分组统计,直接得到结果:
/* 第一步:生成唯一的id+k组合 */ proc summary data=example1 nway noprint; class id k; output out=temp(drop=_type_ _freq_); run; /* 第二步:按id统计组合数量 */ proc summary data=temp nway noprint; class id; output out=result(keep=id counter) n=counter; run; proc print data=result; run;
方法三:Data步By组处理
利用SAS的By组逻辑直接统计:
/* 先按id和k排序,确保By组逻辑生效 */ proc sort data=example1; by id k; run; /* Data步统计每个id下的唯一k数量 */ data result; set example1; by id k; retain counter 0; /* 保留计数变量的值 */ if first.id then counter=0; /* 每个新id开始时重置计数 */ if first.k then counter+1; /* 遇到新的k值时计数加1 */ if last.id then output; /* 每个id的最后一行输出结果 */ keep id counter; /* 只保留需要的变量 */ run; proc print data=result; run;
以上三种方法都能生成目标输出:
id counter 1 3 2 2 3 3
内容的提问来源于stack exchange,提问作者g1_g1
相关产品推荐
相关产品推荐

