使用if条件SAS对逻辑进行分组

Grouping Logic with if conditions 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 

但是,我能够获得第一个 clientID、段和排序变量,但在输出中只有第一个 client ID 和它旁边的段 table HISTORICAL_SEGMENTS3 但只有第一个记录。

如何包含按 client_id 和年月分组时输出的逻辑 基本上每次段与前一个 Yearmonths 段不同时输出一行

你基本上已经在那里了。只需为 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;

这可以通过命令简单地实现 "notsorted"

data abc;
input client_id . segment . 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  

如有任何说明,请告诉我。