Date SAS用于识别连续观测

Date SAS用于识别连续观测,date,sas,Date,Sas,我试图确定最近连续四年发生的事件。假设我有以下样本 Rungroup Year 1 2003 1 2004 1 2005 1 2006 1 2008 1 2009 2 2003 2 2004 2 2005 2 2007 2 2008 2 2009 3 2003 3 2004 基于以下代码,我想删除至少四年内不连续的年份。该方法分为两步。第一步是为连续的年份提供序列号。第二步是基于前瞻方法 data have; set have; by r

我试图确定最近连续四年发生的事件。假设我有以下样本

Rungroup Year
1   2003
1   2004
1   2005
1   2006
1   2008
1   2009
2   2003
2   2004
2   2005
2   2007
2   2008
2   2009
3   2003
3   2004
基于以下代码,我想删除至少四年内不连续的年份。该方法分为两步。第一步是为连续的年份提供序列号。第二步是基于前瞻方法

data have;
set have;
by rungroup;
lyear=lag(year);
if first.rungroup then lyear=.;

if year =1+ lyear then group1+1;
else group1=0;
run;


data have3;
set have2;
by rungroup;

  set have2 ( firstobs = 2 keep = group1 rename = (group1 = next2) )

      have2 (      obs = 1                       );
  next2 = ifn(  last.rungroup, (.), next2 );


  set have2 ( firstobs = 3 keep = group1 rename = (group1 = next3) )

      have2 (      obs = 2                        );

  next3 = ifn(  last.rungroup, (.), next3 );

  set have2 ( firstobs = 4 keep = group1 rename = (group1 = next4) )

      have2 (      obs = 3                       );

  next4 = ifn(  last.rungroup, (.), next4);
 if next4>=3 or next3>=3 or next2>=3 or group1>=3 then output;
run;

这是识别连续观测的有效方法吗?如有任何意见,我们将不胜感激。

如果您的目标是在同一组中标记至少4年序列中的所有obs部分,以下是一种方法

data have;
input Rungroup Year;
datalines;
1 2003
1 2004
1 2005
1 2006
1 2008
1 2009
2 2003
2 2004
2 2005
2 2007
2 2008
2 2009
3 2003
3 2004
;

data want(drop=y);
    if _N_=1 then do;
        declare hash h(dataset:'have');
        h.definekey('Rungroup', 'Year');
        h.definedone();
    end;

    set have;
    array _{-3:3} _temporary_;

    do y=-3 to 3;
        _[y]=h.check(key:Rungroup, key:Year+y);
    end;

    if _[-3]=0 & _[-2]=0 & _[-1]=0
     | _[-2]=0 & _[-1]=0 & _[ 1]=0
     | _[-1]=0 & _[ 1]=0 & _[ 2]=0
     | _[ 1]=0 & _[ 2]=0 & _[ 3]=0
    then flag=1;
run;

如果您的目标是在同一组中标记至少4年序列中的所有obs部分,那么以下是一种方法

data have;
input Rungroup Year;
datalines;
1 2003
1 2004
1 2005
1 2006
1 2008
1 2009
2 2003
2 2004
2 2005
2 2007
2 2008
2 2009
3 2003
3 2004
;

data want(drop=y);
    if _N_=1 then do;
        declare hash h(dataset:'have');
        h.definekey('Rungroup', 'Year');
        h.definedone();
    end;

    set have;
    array _{-3:3} _temporary_;

    do y=-3 to 3;
        _[y]=h.check(key:Rungroup, key:Year+y);
    end;

    if _[-3]=0 & _[-2]=0 & _[-1]=0
     | _[-2]=0 & _[-1]=0 & _[ 1]=0
     | _[-1]=0 & _[ 1]=0 & _[ 2]=0
     | _[ 1]=0 & _[ 2]=0 & _[ 3]=0
    then flag=1;
run;