SAS按个体生成半累积数值列及永久生效标识列实现方法
问题解决方案
1. 日期输入错误原因
你在datalines中填写日期时用了"'01Jan2021'd"这种写法,这是SAS代码中定义日期常量的语法,而datalines里是原始文本值,用date8.输入格式读取时,直接传入01Jan2021即可,多余的引号、d字符会导致读取错位,因此你需要额外加Ignore列兼容错位的数据。
2. 现有代码问题说明
- 个体首行判断逻辑错误:
first.Col1 AND first.Col2 AND first.Col3 AND first.Date的逻辑不正确,同一Col1+Col2+Col3组合对应同一个体,判断新个体开始只需要用first.Col3即可(因为排序时Col1/Col2/Col3是前三个排序键,新的Col3出现必然是新个体)。 - 仅实现了Value_1的累计,没有处理Value_2的累计逻辑。
- 缺少Flag列的状态留存逻辑,需要新增retain变量记录个体是否已经出现过Flag=1的情况。
3. 完整可运行代码
/* 修正后的样例数据生成,不需要Ignore列 */ data data_1; input Col1 $ Col2 $ Col3 $ Date date8. Value_1 Value_2 Flag; format Date date8.; datalines; A1 B1 C1 01Jan2021 0 100 0 A1 B1 C1 01Feb2021 0 0 0 A1 B1 C1 01Mar2021 10 100 0 A1 B1 C1 01Apr2021 50 0 0 A1 B1 C1 01May2021 0 10 1 A1 B1 C1 01Jun2021 10 0 0 A1 B1 C1 01Jul2021 0 0 0 A1 B2 C3 01Jan2021 0 0 0 A1 B2 C3 01Feb2021 0 20 1 A1 B2 C3 01Mar2021 10 20 0 A1 B2 C3 01Apr2021 40 20 0 A1 B2 C3 01May2021 0 0 0 A1 B2 C3 01Jun2021 30 0 0 A1 B2 C3 01Jul2021 0 0 0 ; run; /* 按个体+日期排序,保证累计顺序正确 */ proc sort data=data_1 out=data_sorted; by Col1 Col2 Col3 Date; run; /* 生成累计列并处理Flag逻辑 */ data result; set data_sorted; by Col1 Col2 Col3 Date; /* 留存个体内的累计值和Flag状态 */ retain Value_1_full Value_2_full flag_has_1; /* 新个体开始时重置累计值和Flag状态 */ if first.Col3 then do; Value_1_full = 0; Value_2_full = 0; flag_has_1 = 0; end; /* 计算累计值 */ Value_1_full = Value_1_full + Value_1; Value_2_full = Value_2_full + Value_2; /* 处理Flag逻辑:出现过1之后永久为1 */ if Flag = 1 then flag_has_1 = 1; Flag = flag_has_1; /* drop 临时变量 */ drop flag_has_1 Value_1 Value_2; run;
4. 输出验证
运行上述代码后,result数据集的字段、数值完全匹配你提供的期望输出结果。
内容的提问来源于stack exchange,提问作者uwd
相关产品推荐
相关产品推荐

