You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选同时患糖尿病和癌症的患者?现有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;

回答

你的代码完全正确!思路非常清晰,完美解决了诊断记录分散在多行的问题,我来给你拆解下为什么可行:

  1. 分组聚合的逻辑精准
    你用group by patientID把同一个患者的所有记录合并,然后用max(diabetes)和max(cancer)提取该患者是否有过对应诊断——只要该患者任意一行记录里diabetes=1,max(diabetes)就会返回1,癌症的判断逻辑同理。不管两种诊断在同一行还是不同行,这个方法都能准确捕获到患者的患病情况。

  2. 标记逻辑没问题
    后续data步里,if diabetes GE 1 AND cancer GE 1 THEN both = 1的判断,能正确把同时患有两种病的患者标记出来,逻辑完全通顺。

  3. 统计环节合理
    最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:00:41