如何使用 SAS datastep 保留日期值

问题描述 投票:0回答:1

我有一个带有 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;
sas lag retain datastep
1个回答
0
投票

使用

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 ;

© www.soinside.com 2019 - 2024. All rights reserved.