我使用SAS EG并拥有一个如下所示的数据集:
CLIENT_ID Segment Yearmonth
XXXX A 201305
XXXX A 201306
XXXX A 201307
YYYY A 201305
YYYY A 201306
YYYY B 201307
我想要一个分配给新列的编号的输出,当新帐户存在时会重置:
CLIENT_ID Segment Yearmonth New_Variable
XXXX A 201305 1
XXXX A 201306 2
XXXX A 201307 3
YYYY A 201305 1
YYYY A 201306 2
YYYY B 201307 3
这是第一个问题,我用这段代码解决了这个问题:
PROC SORT DATA= GENERAL.HISTORICAL_SEGMENTS;
by Client_ID;
RUN;
data HISTORICAL_SEGMENTS2;
SET GENERAL.HISTORICAL_SEGMENTS;
count + 1;
by Client_ID;
if first.Client_ID then count = 1;
run;
我想创建第二个数据集,我想看看是否有一种方法只在段变化时获取段:例如从上面的
CLIENT_ID Segment Yearmonth New_Variable
YYYY A 201305 1
YYYY B 201306 2
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
很好地回答你的第一个问题。如果你重新安排一下,我认为这一步更清楚,例如:
data HISTORICAL_SEGMENTS2 ;
set GENERAL.HISTORICAL_SEGMENTS ;
by Client_ID ;
if first.Client_ID then count = 0 ;
count + 1 ;
run;
我认为习惯上将BY语句放在它适用的SET语句之后,为了清楚起见。当Client_ID发生变化时,将计数器重置为0。
看起来你想要第二个数据集,称之为FIRSTS,每个数据集来自每个组。要做到这一点,请注意,一个DATA步骤可以写入多个输出数据集。这可以通过使用显式OUTPUT语句写入每个数据集来完成,例如, :
data HISTORICAL_SEGMENTS2 FIRSTS ;
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 FIRSTS ; *output first of each group;
run;