You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求等价于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:10:07