如何用SAS Proc Summary按ID/MED保留附加变量并获取用药起止日期
问题:在Proc Summary中保留附加变量med_other
需求说明
需要从包含多名患者、多种药物的数据集中,获取每个患者-药物(ID/MED)组合的最早用药开始日期(start)与最晚用药结束日期(stop),同时保留med_other这类附加变量。
原始数据集(HAVE)
| ID | MED | start | stop | med_other |
|---|---|---|---|---|
| B12345 | 86 | 3/23/2021 | 1/9/2022 | |
| B12345 | 86 | 8/17/2021 | 1/9/2022 | |
| B12345 | 86 | 2/10/2022 | 3/5/2023 | |
| B12345 | 99 | 1/1/2020 | 2/15/2020 | someothermedname |
| B12345 | 79 | 3/23/2021 | 1/9/2022 | |
| B12345 | 79 | 4/20/2022 | 4/21/2022 | |
| B12345 | 79 | 5/1/2022 | 4/30/2023 | |
| B12345 | 79 | 6/8/2023 | 7/30/2024 | |
| A54321 | 86 | 1/1/2019 | 1/3/2019 | |
| A54321 | 86 | 2/5/2020 | 3/5/2020 | |
| A54321 | 86 | 3/6/2020 | 4/6/2020 | |
| A54321 | 50 | 1/1/2019 | 1/3/2019 | |
| A54321 | 50 | 2/5/2020 | 3/5/2020 | |
| A54321 | 50 | 3/6/2020 | 4/6/2020 | |
| A54321 | 50 | 5/4/2020 | 5/5/2020 | |
| A54321 | 50 | 5/10/2020 | 5/11/2020 | |
| A54321 | 50 | 6/1/2020 | 8/30/2020 | |
| C98765 | 25 | 6/8/2024 | 10/11/2024 | |
| C98765 | 30 | 6/8/2024 | 12/1/2024 | |
| C98765 | 30 | 6/9/2024 | 12/1/2024 | |
| C98765 | 30 | 8/17/2024 | 12/31/2024 | |
| C98765 | 30 | 1/1/2025 | 1/2/2025 | |
| C98765 | 55 | 5/15/2020 | 5/30/2020 | |
| C98765 | 55 | 4/15/2021 | 6/30/2022 | |
| C98765 | 86 | 1/1/2019 | 2/1/2019 | |
| C98765 | 86 | 3/1/2020 | 4/1/2020 | |
| C98765 | 86 | 1/1/2024 | 2/1/2024 | |
| C98765 | 86 | 3/1/2018 | 3/6/2018 |
期望结果
| ID | MED | start | stop | med_other |
|---|---|---|---|---|
| B12345 | 86 | 3/23/2021 | 3/5/2023 | |
| B12345 | 79 | 3/23/2021 | 7/30/2024 | |
| B12345 | 99 | 1/1/2020 | 2/15/2020 | someothermedname |
| A54321 | 86 | 1/1/2019 | 4/6/2020 | |
| A54321 | 50 | 1/1/2019 | 8/30/2020 | |
| C98765 | 30 | 6/8/2024 | 1/2/2025 | |
| C98765 | 55 | 5/15/2020 | 6/30/2022 | |
| C98765 | 86 | 3/1/2018 | 2/1/2024 |
现有尝试代码
以下代码能生成正确的start和stop,但丢失了med_other变量:
proc summary data=have nway ; class id med ; var start stop; output out=want min(start)=start max(stop)=stop ; run;
解决方案
方法1:使用ID语句(推荐)
在proc summary中添加ID语句,指定需要保留的附加变量。该语句会保留变量值,且不会将其作为分组维度(前提是同一ID/MED组合内的med_other值一致,或你接受取组内第一条观测的变量值):
proc summary data=have nway; class id med; id med_other; /* 保留med_other变量 */ var start stop; output out=want min(start)=start max(stop)=stop; run;
方法2:将附加变量加入CLASS语句
如果同一ID/MED组合内的med_other值完全一致(要么全为空,要么是同一个非空值),可以将med_other加入CLASS语句,这样分组时不会拆分现有组合,同时保留该变量:
proc summary data=have nway; class id med med_other; /* 加入med_other作为分组变量 */ var start stop; output out=want min(start)=start max(stop)=stop; run;
方法3:使用Proc SQL实现(更灵活)
如果需要更灵活地处理med_other(比如提取组内非空值),可以用Proc SQL分组统计,直接保留变量:
proc sql; create table want as select id, med, min(start) as start format=mmddyy10., max(stop) as stop format=mmddyy10., max(med_other) as med_other /* 取组内非空的med_other值 */ from have group by id, med; quit;
内容的提问来源于stack exchange,提问作者Carol-Ann Mullin
相关产品推荐
相关产品推荐

