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 дней друг с другом. Я не знал тип данных, которые у вас были для этого в вашем наборе данных.