разделить данные на группы в SAS proc-sql

Мне нужно создать некоторый цикл в SAS proc-sql, который разделяет данные на группы. У меня есть данные

ID1     ID2 TIME                    GROUP
1234    12  22MAY2015:16:10:00.000  0
1234    12  22MAY2015:16:15:00.000  0
1234    12  12JUN2015:6:35:00.000   0
1234    12  12JUN2015:16:35:00.000  0
6549    45  15APR2015:16:10:00.000  0
6549    45  18APR2015:13:15:00.000  0
6549    45  18APR2015:13:18:00.000  0
6549    15  22MAY2015:14:15:00.000  0
6549    15  22MAY2015:14:20:00.000  0

и мне нужно создать новый столбец GROUP, где будет тот же идентификатор для тех строк, которые имеют одинаковый ID1, тот же ID2, а разница между TIME составляет максимум 10 минут.

Результат будет:

ID1     ID2 TIME                    GROUP
1234    12  22MAY2015:16:10:00.000  1
1234    12  22MAY2015:16:15:00.000  1
1234    12  12JUN2015:6:35:00.000   2
1234    12  12JUN2015:16:35:00.000  3
6549    45  15APR2015:16:10:00.000  4
6549    45  18APR2015:13:15:00.000  5
6549    45  18APR2015:13:18:00.000  5
6549    15  22MAY2015:14:15:00.000  6
6549    15  22MAY2015:14:20:00.000  6

Я попытался написать цикл «делай, пока», но это не сработало.

data b;
set a;
time1 = time;
id1_1 = id1;
id2_1 = id2;
time2 = time;
id1_2 = id1;
id2_2 = id2;
group = group+1;
do while (id1_1 eq id1_2 id2_1 eq id2_2 floor((time2-time1)/60)<=10);
group = group;
time2 = time;
id1_2 = id1;
id2_2 = id2;
end;
run;

Большое тебе спасибо.


person Vendula    schedule 07.07.2015    source источник
comment
Добро пожаловать в SO, вы получите лучший ответ, если опубликуете какие-либо сообщения об ошибках, которые вы видели, или объясните, почему написанный вами код не работает так, как вы ожидали.   -  person mjsqu    schedule 07.07.2015
comment
Привет, этот код работает без вывода. Мне кажется, что он зациклен. Когда я меняю его на, пока не получу какой-то результат, но в столбце группы есть одно и то же число для каждой строки. Не знаю, хорош этот метод. У меня нет опыта работы с петлями, поэтому я думаю, что есть способ лучше или другой способ сделать это.   -  person Vendula    schedule 07.07.2015


Ответы (1)


Proc SQL не подходит для решения вашей проблемы. Вы подумали о «Зацикливании», и это хорошее начало. Однако недостающий элемент в вашем коде - это концепция «запаздывания» вместе с некоторыми другими деталями. Ваше условие группировки состоит из двух частей: 1) На основе естественной группы ID1, ID2 2) Вверху 1), дополнительная группа создается, если ВРЕМЯ отличается более чем на 10 минут.

data have;
    input (ID1     ID2) (:$8.) TIME:datetime23.;
    format TIME:datetime23.;
    cards;
1234    12  22MAY2015:16:10:00.000  1
1234    12  22MAY2015:16:15:00.000  1
1234    12  12JUN2015:6:35:00.000   2
1234    12  12JUN2015:16:35:00.000  3
6549    45  15APR2015:16:10:00.000  4
6549    45  18APR2015:13:15:00.000  5
6549    45  18APR2015:13:18:00.000  5
6549    15  22MAY2015:14:15:00.000  6
6549    15  22MAY2015:14:20:00.000  6
;

data want;
    group+1; /*condition part 1*/

    do until (last.id2);
        set have;
        by id1 id2 notsorted;
        lag_time=lag(time);

        if not first.id2 then group+intck('minute',lag_time,time)>10; /*condition part 2*/
            output;
    end;

    drop lag_time;
run;
person Haikuo Bian    schedule 07.07.2015
comment
Большое спасибо за ваше объяснение и полезный код. Оно работает. - person Vendula; 08.07.2015