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

时间:2017-04-20 02:36:36

标签: sas sas-macro

我的数据集结构如下:

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,段和序列变量,但只能获得输出表HISTORICAL_SEGMENTS3中的第一个客户端ID和它旁边的段,但只能获得第一个记录。

如何在client_id和yearmonth分组时包含输出的逻辑  每当一个段与上一个Yearmonths段不同时,基本上输出一行

2 个答案:

答案 0 :(得分:2)

这可以通过命令“notsorted”

简单地实现
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  

如有任何澄清,请通知我。

答案 1 :(得分:1)

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