【问题标题】:Calculate time interval between successive visits in SAS计算SAS中连续访问之间的时间间隔
【发布时间】:2014-09-21 23:56:22
【问题描述】:

我有重复的长格式,例如

身份证访问日期

1 1 1990-12-16

1 2 1991-01-12

1 3 1991-09-01

2 1 2000-12-12

2 2 2001-11-30

我想计算连续访问之间的时间间隔(以周为单位)。对于每次访问,它将是访问日期 i 减去访问 i-1 的数据 [因此,访问间隔 =0,所有受试者 = 1]

我使用了延迟函数,但它所做的是时间与前一列(这是另一个日期)之间的差异。我怎样才能让它按列处理 id。

我使用了以下代码: 数据数据1;

set data;

by id;

if first.id then interval=0;

else interval=lag(date)/7; *divided by 7 as I wanted the interval to be in weeks;

run; 

有什么帮助吗?如果是重复的帖子,请指导我。但是,我还没有发现任何类似的东西。谢谢。

PS:我不知道如何获取数据格式的数据。请帮助我不要标记它!!!

【问题讨论】:

    标签: datetime sas group-by


    【解决方案1】:

    您不能在条件代码中使用滞后日期,因此请将其从条件语句中删除。

    假设日期是文本,您可以使用 input() 函数将其转换为 SAS 日期。

    data data1; 
    set data; 
    by id; 
    date_sas=input(date, anydtdte.);
    interval_lag=lag(date_sas)/7;
    if first.id then interval=0; 
    else interval=interval_lag; 
    run;
    

    【讨论】:

    • 感谢@reese,但它仍然按行计算,而不是按我想要的按列计算。有什么进一步的帮助吗?
    • 您需要发布一个更好的数据结构示例。很可能你会想要一个数组。
    • 您想要dif 函数而不是lag 吗? Lag 返回上一个观察(行)的值,而dif 返回当前和之前观察之间的差异。 Reese 的第一句话对于diflag 都是正确的;你应该避免在 if 语句中使用这些函数。
    • 是的,dif 函数有效...非常感谢@ArchStanton
    【解决方案2】:

    我不知道你是否还在寻找这个问题的答案,但这应该可以解决问题:

    我是这样读入数据的:

    data test;
    input id visit date :yymmdd.; *this is how you tell SAS to read the date as a date;
    format date yymmdd10.;
    
    datalines;
    1 1 1990-12-16
    1 2 1991-01-12
    1 3 1991-09-01
    2 1 2000-12-12
    2 2 2001-11-30
    ;
    run;
    

    然后计算你想要的:

    data data1; 
    set test; 
    by id; 
    retain date_n;
    if first.id then do;
    interval = 0; 
    date_n = date;
    end;
    else do;
    interval = (date - date_n)/7; 
    date_n = date;
    end;
    run;
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-14
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多