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;