我有一个数据集,该数据集拥有一个时间序列的客户余额和付款时机细节(晚/按时(。我想确定给定客户的计时何时更改(从迟到到按时和相反(,并在发生这种变化时记录相关的余额。
我已经搜索了几个小时的解决方案,我真的坚持了下来,因此您的建议将非常感谢。
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
选项完成工作!