我有一个带有 STS 和 CHGDATE 的 SAS 数据集。我想创建一个新的
Date
变量 NEWCHGDATE
,同时保留相同的日期,直到相同的 STS=03
继续。
ID CHGDATE STS
101 11/22/2022 03
101 11/23/2022 03
101 11/24/2022 03
101 03/08/2023 04
102 01/11/2022 03
102 01/12/2022 05
102 02/12/2023 03
102 02/15/2023 04
WANT
ID CHGDATE STS NEWCHGDATE
101 11/22/2022 03 11/22/2022
101 11/23/2022 03 11/22/2022
101 11/24/2022 03 11/22/2022
101 03/08/2023 04 03/08/2023
102 01/11/2022 03 01/11/2022
102 01/12/2022 05 01/12/2022
102 02/12/2023 03 02/12/2023
102 02/15/2023 04 02/15/2023
例如,在上面,ID 101 从 11/22 到 11/24 有
STS=03
,所以我想保留第一个日期 11/22/2022,直到它在 03/08/2023 达到 STS=04
。
这是我的查询,它没有给我预期的结果
data want;
set have;
by id;
if first.id then do;
lag_sts = '';
newchgdate = chgdate;
end;
else lag_sts = sts;
if sts not in ('03') then newchgdate = chgdate;
else newchgdate = ifn(missing(lag_sts),., lag(newchgdate));
run;
使用
RETAIN
语句指定哪些变量不会在 DATA Step 隐式循环顶部重置为缺失。
使用
LAG
功能检查先前的 sts
值。在条件子句中使用 LAG inside 时要小心(这里没有发生这种情况)。在此示例中,LAG 出现在测试表达式中。
示例:
如果您不熟悉 SAS 和 DATA Step,测试表达式会有点棘手。
data have;
attrib id length=8 CHG_date length=8 informat=mmddyy10. format=mmddyy10. sts length=$3;
input id CHG_date sts ;
datalines ;
101 11/22/2022 03
101 11/23/2022 03
101 11/24/2022 03
101 03/08/2023 04
102 01/11/2022 03
102 01/12/2022 05
102 02/12/2023 03
102 02/15/2023 04
;
data want ;
set have ;
by id ;
attrib new_CHG_date length=8 format=mmddyy10. ;
retain new_CHG_date ;
if sts ne '03' or lag(sts) ne '03' or first.id then
new_CHG_date = CHG_date ;
run ;