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

SAS新手求助:多数据集跨访视对比需求(含/无flag场景)

SAS新手解决方案:跨数据集/访视对比时间变量

一、处理含flag变量的数据集(Dataset1、Dataset2)

步骤1:合并数据集并标记来源

先把两个带flag的数据集合并,添加source变量区分数据来源,方便后续跨数据集对比:

/* 合并Dataset1和Dataset2,标记数据来源 */
data combined_flag;
    set Dataset1(in=d1) Dataset2(in=d2);
    if d1 then source = 'Dataset1';
    else if d2 then source = 'Dataset2';
run;

/* 按Subid、visit排序,确保同一受试者的访视顺序正确 */
proc sort data=combined_flag;
    by Subid visit;
run;

步骤2:合并日期与时间为datetime变量

将date和time合并为SAS标准的datetime格式,简化时间对比逻辑:

data combined_flag_dt;
    set combined_flag;
    /* 把date(日期)和time(时间)转为SAS datetime格式 */
    datetime = dhms(date, 0, 0, time);
run;

步骤3:跨访视、跨数据集对比flag对应的时间

使用PROC SQL自连接,对比同一受试者(Subid)、同一flag下,不同访视/不同数据集的时间差异:

proc sql;
    create table flag_time_comparison as
    select 
        a.Subid,
        a.visit as visit_a, a.source as source_a, a.flag,
        a.date as date_a, a.time as time_a,
        b.visit as visit_b, b.source as source_b,
        b.date as date_b, b.time as time_b,
        /* 直接对比datetime变量,生成差异描述 */
        case 
            when a.datetime = b.datetime then '时间完全一致'
            when a.datetime > b.datetime then 'A记录时间晚于B'
            else 'A记录时间早于B' 
        end as time_diff
    from combined_flag_dt a
    left join combined_flag_dt b
    on a.Subid = b.Subid and a.flag = b.flag  /* 按同一受试者、同一flag匹配 */
    where a.visit ne b.visit or a.source ne b.source; /* 排除自身对比 */
quit;

二、处理无flag变量的数据集(Dataset3、Dataset4)

步骤1:合并数据集并标记来源

同样先合并两个数据集,标记来源:

data combined_noflag;
    set Dataset3(in=d3) Dataset4(in=d4);
    if d3 then source = 'Dataset3';
    else if d4 then source = 'Dataset4';
run;

proc sort data=combined_noflag;
    by Subid visit;
run;

步骤2:跨访视、跨数据集对比日期

方法1:PROC SQL自连接(全面对比所有访视组合)

适合查看同一受试者所有访视/数据集的日期差异:

proc sql;
    create table date_comparison_all as
    select 
        a.Subid,
        a.visit as visit_a, a.source as source_a, a.date as date_a,
        b.visit as visit_b, b.source as source_b, b.date as date_b,
        case 
            when a.date = b.date then '日期一致'
            when a.date > b.date then 'A日期晚于B'
            else 'A日期早于B' 
        end as date_diff
    from combined_noflag a
    left join combined_noflag b
    on a.Subid = b.Subid
    where a.visit ne b.visit or a.source ne b.source;
quit;

方法2:数据步LAG函数(对比相邻访视)

如果只需要看同一受试者相邻访视的日期变化,用LAG函数更简洁:

data date_comparison_lag;
    set combined_noflag;
    by Subid;
    /* 获取前一条记录的日期、访视和来源 */
    prev_date = lag(date);
    prev_visit = lag(visit);
    prev_source = lag(source);
    /* 跳过同一受试者的第一条记录(无前置访视) */
    if first.Subid then do;
        prev_date = .;
        prev_visit = .;
        prev_source = '';
        date_diff = '';
    end;
    else do;
        date_diff = case 
                        when date = prev_date then '与前一访视日期一致'
                        when date > prev_date then '晚于前一访视日期'
                        else '早于前一访视日期' 
                    end;
    end;
run;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:24:29