如何筛选同时患糖尿病和癌症的患者?现有SAS代码是否正确?
问题:验证筛选同时患糖尿病和癌症患者的SAS代码是否正确
我手头有一份患者诊断数据集,每条诊断记录单独占一行,示例数据如下:
patientID diabetes cancer age gender 1 1 0 65 M 1 0 1 65 M 2 1 1 23 M 2 0 0 23 M 3 0 0 50 F 3 0 0 50 F
我的需求是筛选出同时患有糖尿病和癌症的患者,用patientID作为唯一标识。两种诊断可能出现在同一行,也可能分散在不同行,这让我有点困惑怎么处理。
我自己写了一段SAS代码,想请教这段代码是否正确:
PROC SQL; create table want as select patientID , max(diabetes) as diabetes , max(cancer) as cancer , min(DOB) as DOB from diab_dx group by patientID; quit; data final; set want; if diabetes GE 1 AND cancer GE 1 THEN both = 1; else both =0; run; proc freq data=final; tables both; run;
回答
你的代码完全正确!思路非常清晰,完美解决了诊断记录分散在多行的问题,我来给你拆解下为什么可行:
分组聚合的逻辑精准
你用group by patientID把同一个患者的所有记录合并,然后用max(diabetes)和max(cancer)提取该患者是否有过对应诊断——只要该患者任意一行记录里diabetes=1,max(diabetes)就会返回1,癌症的判断逻辑同理。不管两种诊断在同一行还是不同行,这个方法都能准确捕获到患者的患病情况。标记逻辑没问题
后续data步里,if diabetes GE 1 AND cancer GE 1 THEN both = 1的判断,能正确把同时患有两种病的患者标记出来,逻辑完全通顺。统计环节合理
最后用proc freq统计标记结果,能直观看到同时患病的患者占比或数量,符合需求。
另外给你提个小优化建议:可以把标记逻辑直接整合到SQL步骤里,少走一步data步,让代码更简洁:
PROC SQL; create table final as select patientID , max(diabetes) as diabetes , max(cancer) as cancer , min(DOB) as DOB , case when max(diabetes) >= 1 and max(cancer) >= 1 then 1 else 0 end as both from diab_dx group by patientID; quit; proc freq data=final; tables both; run;
但不管是原代码还是优化后的版本,核心逻辑都是正确的,你的写法完全能达成需求~
内容的提问来源于stack exchange,提问作者ybao
相关产品推荐
相关产品推荐

