SAS Подсчет вхождений на основе нескольких слоев в течение установленного периода времени

Я пытаюсь подсчитать случаи, когда одному и тому же человеку выставлялся счет за товар четыре или более раз за одно и то же место в течение 30 дней с каждого экземпляра. Например, ввод будет выглядеть примерно так:

person   service  place  date
A         x       shop1  01/01/15
A         x       shop1  01/15/15
A         x       shop1  01/20/15
B         y       shop2  03/20/15 
B         y       shop2  04/01/15
C         z       shop1  05/05/15

И вывод будет выглядеть примерно так:

person   service  place  date      count
A         x       shop1  01/01/15  3
A         x       shop1  01/15/15  3
A         x       shop1  01/20/15  3
B         y       shop2  03/20/15  2 
B         y       shop2  04/01/15  2
C         z       shop1  05/05/15  1

Я пробовал вещи, похожие на:

data work.want;
 do _n_ =1  by 1 until (last.PLACE);  
   set work.rawdata;
   by PERSON PLACE;
   if first.PLACE then count=0;
   count+1;
 end;
 frequency= count;  
 do _n_ = 1 by 1 until (last.PLACE); 
   set work.rawdata;
   by PERSON PLACE;
   output;
 end;
run;

это дает счет, основанный на человеке и месте, но не учитывает время. Любая помощь или предложения будут с благодарностью! Спасибо

2 ответа

Решение

Это может быть легко сделано с процедурой sql...

Ваши данные:

data have;
input person $ service $ place $;
datalines;
A         x       shop1
A         x       shop1
A         x       shop1
B         y       shop2
B         y       shop2
C         z       shop1
;
run;

Затем мы подсчитываем вхождения "место" для каждой группы 1,2 и присоединяемся к исходной таблице.

proc sql;
create table want as
select a.*, b._count
from have as a
inner join 
(
    select person, service, count(place) as _count
    from have 
    group by 1,2
) as b
on a.person = b.person
and a.service = b.service
;
quit;

Есть ли поле даты? Нам это нужно для того, чтобы сгруппировать данные по месяцам (или 30 дням), например.

proc sql;
create table summary as
select person, service, place, count(*) as count
from rawdata
group by person, service, place
having count>=4;
quit;

Примечание. Это не проверяет, произошли ли события в течение 30 дней друг с другом. Я не знал тип данных, которые у вас были для этого в вашем наборе данных.

Другие вопросы по тегам