SAS - работа с месяцами подряд?
Вопрос
Из данных образца ниже, я пытаюсь определить учетные записи (по идентификатору и SEQ), где происходит произошедшее значение status_date не менее 3 месяцев подряд.Я беспокоюсь с этим некоторое время, и я совсем не уверен, как решать это.
Данные образца:
ID SEQ STATUS_DATE
11111 1 01/01/2014
11111 1 02/10/2014
11111 1 03/15/2014
11111 1 05/01/2014
11111 2 01/30/2014
22222 1 06/20/2014
22222 1 07/15/2014
22222 1 07/16/2014
22222 1 08/01/2014
22222 2 02/01/2014
22222 2 09/10/2014
.
Что мне нужно вернуть:
ID SEQ STATUS_DATE
11111 1 01/01/2014
11111 1 02/10/2014
11111 1 03/15/2014
22222 1 06/20/2014
22222 1 07/15/2014
22222 1 07/16/2014
22222 1 08/01/2014
.
Любая помощь будет оценена.
Решение
Вот один метод:
data have;
input ID SEQ STATUS_DATE $12.;
datalines;
11111 1 01/01/2014
11111 1 02/10/2014
11111 1 03/15/2014
11111 1 05/01/2014
11111 2 01/30/2014
22222 1 06/20/2014
22222 1 07/15/2014
22222 1 07/16/2014
22222 1 08/01/2014
22222 2 02/01/2014
22222 2 09/10/2014
;
run;
data grouped (keep = id seq status_date group) groups (keep = group2);
set have;
sasdate = input(status_date, mmddyy12.);
month = month(sasdate);
year = year(sasdate);
pdate = intnx('month', sasdate, -1);
if lag(year) = year(sasdate) and lag(month) = month(sasdate) then group+0;
else if lag(year) = year(pdate) and lag(month) = month(pdate) then count+1;
else do;
group+1;
count = 0;
end;
if count = 0 and lag(count) > 1 then do;
group2 = group-1;
output groups;
end;
output grouped;
run;
data want (keep = id seq status_date);
merge grouped groups (in=a rename=(group2=group));
by group;
if a;
run;
.
В основном я даю наблюдения в том же групповом номере, если они находятся в последовательных месяцах, то также создают данные, установленные с групповыми номерами групп с более чем 2 наблюдениями.Затем я объединяю эти два набора данных и только держать наблюдения, которые находятся во втором наборе данных, то есть с более чем 2 наблюдениями.
Другие советы
Как насчет следующего.Однако вы можете захотеть сортировать в месяц, если это то, что вы хотите.
data want;
do _n_ = 1 by 1 until(last.id);
set survey;
by id;
if _n_ <=3 then output;
end;
run;
.