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

如何在SAS中按家庭识别队列数据集的索引病例?

按家庭标记最早发病的索引病例(SAS实现)

我是SAS新手,正在处理一项队列数据集:该数据集招募的家庭均有成员确诊呼吸道疾病阳性,每个成员有独立的PTID(受试者ID)和HouseholdID(家庭ID),同户成员的HouseholdID一致。我需要定义索引病例:在同一家庭中,将OnsetDate(发病日期)最早的成员标记为索引病例(值为1),其余成员标记为0。我尝试编写了如下代码,但无法正常运行:

data house; 
set house;
if householdID==householdID and min(onsetdate) then index=1; 
else if index = 0; 
run; 

原数据集

PTIDHouseholdIDOnsetDate
10110/11/2022
11110/14/2022
12110/9/2022
13210/11/2022
14210/12/2022

目标处理结果

PTIDHouseholdIDOnsetDateIndexCase
10110/11/20220
11110/14/20220
12110/9/20221
13210/11/20221
14210/12/20220

可行的SAS代码实现

方法1:DATA步+BY分组处理

先对数据集按家庭ID和发病日期排序,再利用SAS的first.变量标记同家庭中最早发病的成员:

/* 按家庭ID和发病日期升序排序,确保同家庭内日期最早的排在第一位 */
proc sort data=house;
    by householdID onsetdate;
run;

/* 生成带索引病例标记的数据集 */
data house_index;
    set house;
    by householdID;
    /* 当是当前家庭的第一行(即发病日期最早)时标记为1,其余为0 */
    indexcase = ifn(first.householdID, 1, 0);
run;

方法2:PROC SQL窗口函数

无需提前排序,直接用窗口函数计算每个家庭的最早发病日期并对比:

proc sql;
    create table house_index as
        select 
            ptid,
            householdID,
            onsetdate,
            /* 对比当前成员发病日期是否等于家庭内最早日期,是则标记1,否则0 */
            case when onsetdate = min(onsetdate) over (partition by householdID)
                 then 1
                 else 0
            end as indexcase
        from house;
quit;

内容的提问来源于stack exchange,提问作者Jeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:58:14