使用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
如有任何说明,请告诉我。
我有一个结构如下的数据集:
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
如有任何说明,请告诉我。