Логика группировки с условиями if SAS

У меня есть набор данных, структурированный следующим образом:

CLIENT_ID    Segment      Yearmonth       
XXXX         A            201305         
XXXX         A            201306         
XXXX         B            201307         
XXXX         B            201308         
XXXX         C            201309         
XXXX         A            201310        
YYYY         D            201306
YYYY         D            201307
YYYY         C            201308
YYYY         D            201309
ZZZZ         E            201309
ZZZZ         E            201309
ZZZZ         E            201309

Это результат, который я пытаюсь получить

CLIENT_ID    Segment       New_sequencing_Variable    
XXXX         A                       1
XXXX         B                       2
XXXX         C                       3
XXXX         A                       4
YYYY         D                       1
YYYY         C                       2
YYYY         D                       3
ZZZZ         E                       1

Код, который у меня есть до сих пор:

HISTORICAL_SEGMENTS2 HISTORICAL_SEGMENTS3 ;
  set GENERAL.HISTORICAL_SEGMENTS ;
  by Client_ID ;
  if first.Client_ID then count = 0 ;
  count + 1 ;
  output HISTORICAL_SEGMENTS2 ; *output every record;
  if first.Client_ID then output HISTORICAL_SEGMENTS3 ;  *output first of each group;
run;

мне нужно что-то вроде:

 if previous.segment <> current.segment then output HISTORICAL_SEGMENTS3 

Однако я могу получить первый идентификатор клиента, сегмент и переменную последовательности, но только первый идентификатор клиента и сегмент рядом с ним в выходной таблице HISTORICAL_SEGMENTS3, но только первую запись.

Как включить логику, которая выводится при группировке по client_id и yearmonth, в основном выводит строку строки каждый раз, когда сегмент отличается от предыдущего сегмента Yearmonths


person Data Guy    schedule 20.04.2017    source источник


Ответы (2)


По сути, вы уже там. Просто добавьте еще одну переменную счетчика для набора данных HISTORICAL_SEGMENTS3 и переменную запаздывания для предыдущих наблюдений за сегментом.

data HISTORICAL_SEGMENTS2 HISTORICAL_SEGMENTS3;
    set HISTORICAL_SEGMENTS;
    by Client_ID;
    if first.Client_ID then do;
        count = 0;
        count2 = 0;
    end;
    count + 1;

    prev_segment = lag(segment);
    if prev_segment ne segment then do;
        count2 + 1;
        output HISTORICAL_SEGMENTS3;
    end;
    output HISTORICAL_SEGMENTS2;
    drop prev_segment;
run;
person Seba    schedule 20.04.2017
comment
Спасибо за это!! это именно то, что мне нужно. - person Data Guy; 21.04.2017

Этого можно просто добиться с помощью команды "не отсортировано".

data abc;
input client_id $5. segment $2. yearmonth  ;
cards; 
xxxx a 201305
xxxx a 201306
xxxx b 201307
xxxx b 201308
xxxx c 201309
xxxx a 201310
yyyy d 201306
yyyy d 201307
yyyy c 201308
yyyy d 201309
zzzz e 201309
zzzz e 201309
zzzz e 201309
;
run;


data abc1;
set abc;
by client_id segment notsorted;
if first.segment;
if first.client_id then new_sequencing_variable = 0;
new_sequencing_variable + 1;
run;  

Мои результаты:

client_id   segment       new_sequencing_variable    
XXXX         A                       1
XXXX         B                       2
XXXX         C                       3
XXXX         A                       4
YYYY         D                       1
YYYY         C                       2
YYYY         D                       3
ZZZZ         E                       1  

Дайте мне знать в случае каких-либо уточнений.

person G.Arima    schedule 20.04.2017