在SAS中如何实现两类自定义衍生字段的生成需求?
SAS 需求实现代码
需求一:当test2字段值为0时新增test4列
当test2字段值为0时,基于test3字段生成test4列(示例逻辑为直接取test3的值,可根据实际需求调整计算规则):
data want1; set have; if test2 = 0 then test4 = test3; /* 若需给test2≠0的行设置test4值,可添加else语句,例如:else test4 = .; */ run;
需求二:按分组规则生成Amt_H列并过滤行
输入数据集示例
先创建题目给出的输入数据集:
data input_data; input Tl $ LineNo Amnt_pd; datalines; 01 0 . 01 1 93 01 2 0 01 3 25 01 4 0 02 0 40 02 1 0 ; run;
实现代码(PROC SQL版)
通过分组计算基准值,再关联原数据生成结果:
proc sql; create table output_data as select i.Tl, i.LineNo, i.Amnt_pd, case when base.base_amt is not missing then base.base_amt else base.sum_amt end as Amt_H from input_data i left join ( select Tl, max(case when LineNo=0 then Amnt_pd else . end) as base_amt, sum(case when LineNo ne 0 then Amnt_pd else 0 end) as sum_amt from input_data group by Tl ) base on i.Tl = base.Tl where i.LineNo ne 0 order by i.Tl, i.LineNo; quit;
代码说明
- 子查询
base按Tl分组,计算两个核心值:base_amt:分组内LineNo=0对应的Amnt_pd值(非缺失则保留,缺失则为缺失值)sum_amt:分组内所有LineNo≠0行的Amnt_pd求和结果
- 主查询通过
case逻辑判断:若base_amt非缺失则取该值,否则取sum_amt作为Amt_H - 最后过滤掉
LineNo=0的行,按Tl和LineNo排序
替代实现(DATA步版)
若习惯用DATA步处理分组逻辑,可按以下方式实现:
/* 第一步:计算每个分组的基准值 */ data group_info; set input_data; by Tl; retain base_amt sum_amt 0; if first.Tl then do; base_amt = .; sum_amt = 0; end; if LineNo=0 then base_amt = Amnt_pd; else sum_amt + Amnt_pd; if last.Tl then output; keep Tl base_amt sum_amt; run; /* 第二步:合并数据并生成结果 */ data output_data; merge input_data group_info; by Tl; if LineNo ne 0 then do; Amt_H = coalesce(base_amt, sum_amt); output; end; drop base_amt sum_amt; run;
内容的提问来源于stack exchange,提问作者Supraa
相关产品推荐
相关产品推荐

