我的数据集结构如下:
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段不同时,基本上输出一行
答案 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;