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

如何基于同一ID的多状态条件生成目标SAS数据集?

高效处理SAS数据集的状态聚合逻辑

原始数据集

data df; 
input ID status$; 
datalines; 
1 YES
1 YES
1 YES
2 NO
2 YES
2 YES
2 YES
2 YES
3 NO
3 NO
3 NO
;
run;

需求说明

按ID聚合状态:

  • 同一ID下只要存在至少一个NO,最终状态为NO
  • 同一ID下所有status均为YES,最终状态为YES

以下是两种比proc transpose更高效的实现方法:

方法1:Proc SQL(简洁高效)

利用字符排序特性,用min()函数直接聚合,代码量最少,执行效率高:

proc sql;
create table df_final as
select ID, min(status) as status$
from df
group by ID;
quit;

原理:字符排序中NO的ASCII码小于YES,因此min(status)会优先返回NO;仅当所有状态都是YES时,才会返回YES,完全匹配需求。

方法2:Data步分组处理(大数据量友好)

通过BY分组遍历观测,用retain保留状态标记,适合超大数据集的批量处理:

data df_final;
set df;
by ID;
retain final_status;
if first.ID then final_status = 'YES'; /* 初始化默认状态为YES */
if status = 'NO' then final_status = 'NO'; /* 发现NO立即更新状态 */
if last.ID then do;
    status = final_status;
    output; /* 仅输出每个ID的最终结果 */
end;
drop final_status;
run;

原理:每个ID的第一条观测初始化状态为YES,遍历过程中只要遇到NO就修改状态,最后在每个ID的最后一条观测时输出结果,避免了转置操作的额外开销。

目标输出结果

data df_final; 
input ID status$; 
datalines; 
1 YES
2 NO
3 NO
;
run;

内容的提问来源于stack exchange,提问作者An116

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:47:07