假设有以下数据集:
data DB;
input ID :$20. Admission :date09. Discharge :date09. morbidity;
format Admission date9. Discharge date9.;
cards;
0001 13JAN2017 25JAN2017 1
0001 13JAN2017 25JAN2017 1
0001 22FEB2018 03MAR2018 0
0001 30JAN2019 04MAR2019 0
0002 01DEC2018 14DEC2018 0
0002 25DEC2018 02JAN2019 1
0002 25NOV2020 03DEC2020 0
0003 09JAN2016 25JAN2016 0
0003 29JAN2018 12FEB2018 0
...;
发病率 = 1 表示发病发生在该日期。如果复制日期,则如果发生发病则为 1,如果未发生则为 0。有没有办法获取以下数据集?
data DB1;
input ID :$20. Admission :date09. Discharge :date09. morbidity new_morbidity;
format Admission date9. Discharge date9.;
cards;
0001 13JAN2017 25JAN2017 1 1
0001 13JAN2017 25JAN2017 1 1
0001 22FEB2018 03MAR2018 0 1
0001 30JAN2019 04MAR2019 0 1
0002 01DEC2018 14DEC2018 0 0
0002 25DEC2018 02JAN2019 1 1
0002 25NOV2020 03DEC2020 0 1
0003 09JAN2016 25JAN2016 0 0
0003 29JAN2018 12FEB2018 0 0
...;
换句话说,对于每个日期,对于每个ID(患者),如果发病发生在实际日期之前,则实际日期如果发病=0,则new_morbidity = 1。否则,当然,它将有new_morbidity=如果发病率已经 = 1,则为 1。逐行、逐日查看患者病史。
有人可以帮助我吗?我不知道如何管理之前的实际日期与日期的比较。
提前谢谢您
假设您的数据按
ID, admission
排序。当患者死亡时,其后所有记录的morbidity
都将为 1。我们可以利用按组处理和 retain
语句来处理这个问题。
我们将通过将现有的
morbidity
变量重命名为名为 _morbidity
的新变量来完成此操作。然后,我们将重新创建发病率变量,但会自动保留它。由于它的值不是在每一步都初始化的,所以我们只会在某些情况下给它一个值。该值将保留,直到我们决定它需要一个新值。
如果它是组中的第一个 ID 或者
_morbidity
为 1,则将 morbidity
设置为该值。这意味着如果第一个值是 0 或 1,则 0 或 1 将始终继续向前。如果它从 0 翻转到 1,我们也会继续为该患者保持 1。
data want;
set db(rename=(morbidity=_morbidity));
by id;
retain morbidity;
if(first.id or _morbidity=1) then morbidity = _morbidity;
drop _morbidity;
run;
ID Admission Discharge morbidity
0001 13JAN2017 25JAN2017 1
0001 13JAN2017 25JAN2017 1
0001 22FEB2018 03MAR2018 1
0001 30JAN2019 04MAR2019 1
0002 01DEC2018 14DEC2018 0
0002 25DEC2018 02JAN2019 1
0002 25NOV2020 03DEC2020 1
0003 09JAN2016 25JAN2016 0
0003 29JAN2018 12FEB2018 0