SAS中的纵向计算

时间:2014-07-09 17:17:21

标签: sas

我有一份患者数据和他们的访问日期。我将在他们访问的90天内了解他们行为的变化。

我有这样的数据。,

PERSN Reg_date  out_date    Formulartyp
225 11-apr-12   03-jun-13   Gles
225 03-sep-13   06-sep-13   Täta
458 13-mar-13   03-apr-13   Täta
458 22-jul-13   07-aug-13   Täta
458 22-aug-13   28-nov-13   Gles
559 11OCT2013   25OCT2013   Täta
559 01-nov-13   04-dec-13   Gles
897 08-feb-12   11-jan-13   Gles
897 18-jan-13   05-feb-13   Täta
897 26-feb-13   30-apr-13   Täta
897 14MAY2013   01OCT2013   Gles
897 08OCT2013   29OCT2013   Täta
565 08-jan-13   17-jun-13   Gles
565 03-sep-13   27-dec-13   Gles
878 07-dec-12   09-jan-13   Täta
878 16-jan-13   31MAY2013   Gles
554 19-dec-12   08-jan-13   Gles
554 22-mar-13   16-apr-13   Täta
554 15MAY2013   16-jul-13   Gles
554 09-sep-13   17-sep-13   Täta
554 24-sep-13   29OCT2013   Gles

我想找出out_date和下一个reg_date之间的差异(以天为单位),然后找出是否存在formulartyp的差异。

我正在尝试使用first.persnr和lag函数,但我无法得到它。

2 个答案:

答案 0 :(得分:0)

一种方法是使用LAG功能...... 我正在给出一个粗略的代码。根据您的要求修改

data compared;
attrib date_diff formulartyp_diff length=8.;
set indata;
prev_persn=lag(persn);
prev_out=lag(out_date);
if(persn eq prev_persn and formulartyp ne lag(formulartyp)) then do;
    formulartyp_diff=1;
end;
if(persn eq prev_persn) then do;
    date_diff=input(reg_date,date9.)-input(prev_out,date9.);
end;
run;

答案 1 :(得分:0)

我倾向于不使用滞后函数,我更喜欢使用retain从前一个观察中获取变量的值。分配需要在数据步骤中完成。 您需要使用适当的信息将日期转换为sas日期(自1960年1月1日以来的天数)以计算日差。数据需要按患者和日期排序。

data visits;
input
    @1  PERSN        3.
    @5  Reg_date     date9.
    @17 out_date     date9. 
    @29 Formulartyp  $4.
;
format Reg_date out_date date9.;
datalines;
225 11-apr-12   03-jun-13   Gles
225 03-sep-13   06-sep-13   Täta
458 13-mar-13   03-apr-13   Täta
458 22-jul-13   07-aug-13   Täta
458 22-aug-13   28-nov-13   Gles
559 11OCT2013   25OCT2013   Täta
559 01-nov-13   04-dec-13   Gles
897 08-feb-12   11-jan-13   Gles
897 18-jan-13   05-feb-13   Täta
897 26-feb-13   30-apr-13   Täta
897 14MAY2013   01OCT2013   Gles
897 08OCT2013   29OCT2013   Täta
565 08-jan-13   17-jun-13   Gles
565 03-sep-13   27-dec-13   Gles
878 07-dec-12   09-jan-13   Täta
878 16-jan-13   31MAY2013   Gles
554 19-dec-12   08-jan-13   Gles
554 22-mar-13   16-apr-13   Täta
554 15MAY2013   16-jul-13   Gles
554 09-sep-13   17-sep-13   Täta
554 24-sep-13   29OCT2013   Gles
;
run;
proc sort data=visits;
    by PERSN Reg_date;
run;
data visits;
    set visits;
    by PERSN;
    retain LagOut_date LagFormulartyp;
    if not first.PERSN then do;
        NDays=Reg_date-LagOut_date;
               /*boolean variable:1 if the condition is satisfied, 0 otherwise*/
        Change=(LagFormulartyp^=Formulartyp);
    end;
    LagFormulartyp=Formulartyp;
    LagOut_date=Out_date;
    drop LagFormulartyp LagOut_date;
run;

如果您愿意,可以在NDays> = 90

上进行过滤