Я использую следующий код для идентификации и вывода трех предыдущих лет. Чтобы получить более подробную информацию, образец включает несколько идентификаторов людей, и каждый идентификатор человека имеет наблюдения в течение нескольких лет. В окончательной выборке будет сохранено только удостоверение личности человека, которое, по крайней мере, имело три предыдущих года (например, 2001, 2002, 2003).
data have3 ;
set have2;
by personid;
set have2 ( firstobs = 2 keep = year rename = (year = _year2) )
have2 ( obs = 1 drop = _all_ );
_year2 = ifn( last.personid, (.), _year2 ); /*output the value of next year*/
set have2 ( firstobs = 3 keep = year rename = (year = _year3) )
have2 ( obs = 2 drop = _all_ );
_year3 = ifn( last.personid, (.), _year3 ); /*output the value of the year after the next year*/
_prev1 = ifn( first.personid, (.), lag(year) ); /*output the value of previous year*/
_prev2 = ifn( first.personid, (.), lag2(year) );/*output the value of the year before the previous year*/
if (year-2 eq _prev1-1 eq _prev2) or
(year+2 eq _year2+1 eq _year3) or
(year eq _year2-1 eq _prev1+1) then output;
run;
Этот код подходит в большинстве случаев. Тем не менее, мой образец имеет несколько хитрых ситуаций. На следующем рисунке показана одна из ситуаций. У человека с ID 488 есть только два наблюдения (1994 и 1995 годы). К сожалению, первый год следующего идентификатора человека 489 - 1996. Следовательно, _year3 из ID488 Year1994 - это 1996, что делает year+2 eq _year2+1 eq _year3
реальностью. В результате ID488 Year1994 также выводится в окончательный образец. Как я могу улучшить код, чтобы избежать этой ситуации? Спасибо!