SAS - ¿Trabajando con meses consecutivos?
Pregunta
De los datos de muestra a continuación, estoy tratando de identificar cuentas (por ID y SEC) donde existe una aparición de status_date durante al menos 3 meses consecutivos.He estado jugando con esto por un tiempo y no estoy seguro de que lo abordar.
Datos de muestra:
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
lo que necesito para devolver:
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
Cualquier ayuda sería apreciada.
Solución
Aquí hay un método:
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;
Básicamente, le doy observaciones el mismo número de grupo si están en meses consecutivos, también cree un conjunto de datos con números de grupo de grupos con más de 2 observaciones.Luego fusioné esos dos conjuntos de datos y solo mantienen las observaciones que se encuentran en el segundo conjunto de datos, es decir, aquellas con más de 2 observaciones.
Otros consejos
¿Qué tal si sigue?Sin embargo, es posible que desee sort en el mes si es lo que desea.
data want;
do _n_ = 1 by 1 until(last.id);
set survey;
by id;
if _n_ <=3 then output;
end;
run;