SAS识别何时随时间变化(在组内),并记录每个更改的余额



我有一个数据集,该数据集拥有一个时间序列的客户余额和付款时机细节(晚/按时(。我想确定给定客户的计时何时更改(从迟到到按时和相反(,并在发生这种变化时记录相关的余额。

我已经搜索了几个小时的解决方案,我真的坚持了下来,因此您的建议将非常感谢。

data have;
input customer date payment_status $ balance;
cards;
1 201601 on_time 80
1 201602 on_time 70
1 201603 late 60
1 201604 late 60
1 201605 on_time 50
1 201606 on_time 40
1 201607 late 40
2 201603 late 120
2 201604 on_time 100
2 201605 on_time 80
2 201606 late 60
3 201606 late 200
3 201607 late 190
3 201608 late 180
3 201609 on_time 170
3 201610 on_time 160
3 201611 on_time 150
3 201612 on_time 140
4 201603 late 80
4 201604 late 50
4 201605 late 20
;run;

最终,我希望输出看起来像下面的,因此在新列中记录了每个客户的余额以及pealdion_status的更改。

请注意,客户的第一个实例未记录在新变量中(var1_status_change& var2_bal_at_change( - 仅当原始状态与触发器输入新vars的原始值相比,原始状态已更改时。

output_dataset

customer  date  payment_status  balance VAR1_STATUS_CHANGE  VAR2_BAL_AT_CHANGE
1     201601    on_time         80                          .
1     201602    on_time         70                          .
1     201603    late            60      late                60
1     201604    late            60                          .
1     201605    on_time         50      on_time             50
1     201606    on_time         40                          .
1     201607    late            40      late                40
2     201603    late            120                         .
2     201604    on_time         100     on_time             100
2     201605    on_time         80                          .
2     201606    late            60      late                60
3     201606    late            200                         .
3     201607    late            190                         .
3     201608    late            180                         .
3     201609    on_time         170     on_time             170
3     201610    on_time         160                         .
3     201611    on_time         150                         .
3     201612    on_time         140                         .
4     201603    late            80                          .
4     201604    late            50                          .
4     201605    late            20                          .

我已经尝试使用。方法,但无法按照我想要的答案来获得我的"按"分组。可能需要事先一个单独的数据步骤。

proc sort data=have;
    by customer payment_status;
run;
data want;
    set have;
    by customer payment_status;
        if first.payment_status then VAR1_STATUS_CHANGE = payment_status;
        if first.payment_status then VAR2_BAL_AT_CHANGE = balance;
run;
proc sort data=want;
    by customer date payment_status;
run;

我想知道是否有一种解决问题的方法。非常感谢。

您的答案非常接近,但需要进行一些调整。

首先,按客户和日期进行排序以按正确的顺序获取数据。随后的数据步骤具有正确的by变量,但是您需要添加notsorted选项,以避免使用pealdion_status未被排序的错误。

我已经将条件and not first.customer添加到if语句中,因此它不会填充给定客户的第一个记录。

我已经使用了do语句,该语句避免重复if条件。

您现在不需要第二个proc sort,因为数据按正确顺序。

data have;
input customer date payment_status $ balance;
cards;
1 201601 on_time 80
1 201602 on_time 70
1 201603 late 60
1 201604 late 60
1 201605 on_time 50
1 201606 on_time 40
1 201607 late 40
2 201603 late 120
2 201604 on_time 100
2 201605 on_time 80
2 201606 late 60
3 201606 late 200
3 201607 late 190
3 201608 late 180
3 201609 on_time 170
3 201610 on_time 160
3 201611 on_time 150
3 201612 on_time 140
4 201603 late 80
4 201604 late 50
4 201605 late 20
;
run;
proc sort data=have;
    by customer date;
run;
data want;
    set have;
    by customer payment_status notsorted;
        if first.payment_status and not first.customer then do;
            VAR1_STATUS_CHANGE = payment_status;
            VAR2_BAL_AT_CHANGE = balance;
            end;
run;

这是一个完美的答案。notsorted选项完成工作!

最新更新