sas - 在 SAS 中创建复杂的逻辑计数器变量
问题描述
我必须在数据集中创建复杂的(对我而言)计数器变量。我试图尽可能清楚地解释。如果有任何不清楚的地方,请告诉我。希望在您的帮助下,我可以实现我的期望。
我需要创建三个变量:Probation_Count、Probation_Flag 和 Cure_Count。
创建三个变量是特定于 CID 的(我们按 CID 分组)。
Probation_Count 和 Probation_Flag 条件
- 条件 1 - 当合约从 Default_Flag =Y 变为 Default_Flag = N 且 probation_flag = Y 时,probation_count 从 1 开始。
- 条件 2 - 只要 DPD = 0 且 Default_Flag =N,试用标志 =Y,试用计数就会增加
- 条件 3 - 当 DPD >0 且 DPD <= 3 且 Defult_Flag=N 时,probation_count 必须保持在 DPD = 0 时的值;一旦 DPD =0 且 default_flag = N,probation_flag =Y,probation_count 将开始增加
- 条件 4 - 当 DPD >3 且 default_flag = N 时,试用期计数重置为 0,直到 DPD = 0 且 default_Flag=N,试用期标志 = Y
- 条件 5 - probation_count 可以增加到 10,然后重置为 0,probation_flag = Y 直到 probation count =10
- 条件 6 - 当 Default_Flag = Y 时,probation_count = 0 和 Probation_flag = N。为了启动 probation_count 合约必须从 default_flag= Y 移动到 Default_flag=N。
Cure_count 条件
- 条件 1 - 当前一个日期 probation_count 为 10 且当前日期 default_flag = N 时,cure_count 从 1 开始
- 条件 2 - Cure_count 将增加,直到默认标志 = Y 或 Cure_count = 10
请在下面找到示例数据。
我手动计算了 probation_count、probation_flag 和cure_count。
data sample;
INFILE DATALINES DLM='#';
input CID date ddmmyy10. DPD Default_Flag $ Probation_Count probation_Flag $ Cure_count;
format date ddmmyy10.;
datalines;
111#04/04/2021#87#N#00# #0
111#05/04/2021#88#N#00# #0
111#06/04/2021#89#N#00# #0
111#07/04/2021#90#Y#00# #0
111#08/04/2021#91#Y#00# #0
111#09/04/2021#92#Y#00# #0
111#10/04/2021#93#Y#00# #0
111#11/04/2021#00#N#01#Y#0
111#12/04/2021#00#N#02#Y#0
111#13/04/2021#00#N#03#Y#0
111#14/04/2021#00#N#04#Y#0
111#15/04/2021#00#N#05#Y#0
111#16/04/2021#01#N#05#Y#0
111#17/04/2021#02#N#05#Y#0
111#18/04/2021#00#N#06#Y#0
111#19/04/2021#00#N#07#Y#0
111#20/04/2021#00#N#08#Y#0
111#21/04/2021#00#N#09#Y#0
111#22/04/2021#00#N#10#Y#0
111#23/04/2021#00#N#00# #1
111#24/04/2021#00#N#00# #2
111#25/04/2021#00#N#00# #3
222#04/04/2021#86#N#00# #0
222#05/04/2021#87#N#00# #0
222#06/04/2021#88#N#00# #0
222#07/04/2021#89#N#00# #0
222#08/04/2021#90#Y#00# #0
222#09/04/2021#91#Y#00# #0
222#10/04/2021#92#Y#00# #0
222#11/04/2021#93#Y#00# #0
222#12/04/2021#94#Y#00# #0
222#13/04/2021#95#Y#00# #0
222#14/04/2021#96#Y#00# #0
333#04/04/2021#87#N#00# #0
333#05/04/2021#88#N#00# #0
333#06/04/2021#89#N#00# #0
333#07/04/2021#90#Y#00# #0
333#08/04/2021#91#Y#00# #0
333#09/04/2021#92#Y#00# #0
333#10/04/2021#00#N#01#Y#0
333#11/04/2021#00#N#02#Y#0
333#12/04/2021#00#N#03#Y#0
333#13/04/2021#00#N#04#Y#0
333#14/04/2021#00#N#05#Y#0
333#15/04/2021#00#N#06#Y#0
333#16/04/2021#01#N#05#Y#0
333#17/04/2021#02#N#05#Y#0
333#18/04/2021#03#N#05#Y#0
333#19/04/2021#04#N#00#Y#0
333#20/04/2021#05#N#00#Y#0
333#21/04/2021#00#N#01#Y#0
333#22/04/2021#00#N#02#Y#0
333#23/04/2021#00#N#03#Y#0
333#24/04/2021#00#N#04#Y#0
333#25/04/2021#00#N#05#Y#0
333#26/04/2021#00#N#06#Y#0
333#27/04/2021#00#N#07#Y#0
333#28/04/2021#00#N#08#Y#0
333#29/04/2021#00#N#09#Y#0
333#30/04/2021#00#N#10#Y#0
333#01/05/2021#00#N#00# #1
333#02/05/2021#00#N#00# #2
333#03/05/2021#00#N#00# #3
333#04/05/2021#90#Y#00# #0
333#05/05/2021#91#Y#00# #0
;
run;
非常感谢您的时间和帮助
解决方案
数据和解释不是 100% 清楚的,但是这个示例代码可能会帮助您完全了解您正在尝试的复杂规则。
我需要创建三个变量:Probation_Count、Probation_Flag 和 Cure_Count。
我希望这意味着这些变量及其值只能从 and 的状态和更改状态中计算default_flag
出来dpd
。您不清楚如何或是否应将在前一行中计算的值结转到下一行计算中。
例子:
data have;
INFILE DATALINES DLM='#';
input CID date ddmmyy10. DPD Default_Flag $ Probation_Count_X Probation_Flag_X $ Cure_Count_X;
format date ddmmyy10.;
datalines;
111#04/04/2021#87#N#00# #0
111#05/04/2021#88#N#00# #0
111#06/04/2021#89#N#00# #0
111#07/04/2021#90#Y#00# #0
111#08/04/2021#91#Y#00# #0
111#09/04/2021#92#Y#00# #0
111#10/04/2021#93#Y#00# #0
111#11/04/2021#00#N#01#Y#0
111#12/04/2021#00#N#02#Y#0
111#13/04/2021#00#N#03#Y#0
111#14/04/2021#00#N#04#Y#0
111#15/04/2021#00#N#05#Y#0
111#16/04/2021#01#N#05#Y#0
111#17/04/2021#02#N#05#Y#0
111#18/04/2021#00#N#06#Y#0
111#19/04/2021#00#N#07#Y#0
111#20/04/2021#00#N#08#Y#0
111#21/04/2021#00#N#09#Y#0
111#22/04/2021#00#N#10#Y#0
111#23/04/2021#00#N#00# #1
111#24/04/2021#00#N#00# #2
111#25/04/2021#00#N#00# #3
222#04/04/2021#86#N#00# #0
222#05/04/2021#87#N#00# #0
222#06/04/2021#88#N#00# #0
222#07/04/2021#89#N#00# #0
222#08/04/2021#90#Y#00# #0
222#09/04/2021#91#Y#00# #0
222#10/04/2021#92#Y#00# #0
222#11/04/2021#93#Y#00# #0
222#12/04/2021#94#Y#00# #0
222#13/04/2021#95#Y#00# #0
222#14/04/2021#96#Y#00# #0
333#04/04/2021#87#N#00# #0
333#05/04/2021#88#N#00# #0
333#06/04/2021#89#N#00# #0
333#07/04/2021#90#Y#00# #0
333#08/04/2021#91#Y#00# #0
333#09/04/2021#92#Y#00# #0
333#10/04/2021#00#N#01#Y#0
333#11/04/2021#00#N#02#Y#0
333#12/04/2021#00#N#03#Y#0
333#13/04/2021#00#N#04#Y#0
333#14/04/2021#00#N#05#Y#0
333#15/04/2021#00#N#06#Y#0
333#16/04/2021#01#N#05#Y#0
333#17/04/2021#02#N#05#Y#0
333#18/04/2021#03#N#05#Y#0
333#19/04/2021#04#N#00#Y#0
333#20/04/2021#05#N#00#Y#0
333#21/04/2021#00#N#01#Y#0
333#22/04/2021#00#N#02#Y#0
333#23/04/2021#00#N#03#Y#0
333#24/04/2021#00#N#04#Y#0
333#25/04/2021#00#N#05#Y#0
333#26/04/2021#00#N#06#Y#0
333#27/04/2021#00#N#07#Y#0
333#28/04/2021#00#N#08#Y#0
333#29/04/2021#00#N#09#Y#0
333#30/04/2021#00#N#10#Y#0
333#01/05/2021#00#N#00# #1
333#02/05/2021#00#N#00# #2
333#03/05/2021#00#N#00# #3
333#04/05/2021#90#Y#00# #0
333#05/05/2021#91#Y#00# #0
;
data want;
length rule $1 probation_count 8 probation_flag $1 cure_count 8;
length trigger_counting pcounting 8;
retain pcounting probation_count;
set have;
by cid;
rule = ' ';
if first.cid then do;
probation_count = 0;
probation_flag = ' ';
trigger_counting = 0;
pcounting = 0;
end;
trigger_counting =
default_flag = 'N'
and
( lag(default_flag) = 'Y' and NOT first.cid )
;
if default_flag = 'N' then do;
* set the counting flag 'pcounting' and initialize count;
if trigger_counting then do;
pcounting = 1;
probation_count = 1;
probation_flag = 'Y';
rule = '1';
return;
end;
* increment count for no dpd, reset if necessary;
if pcounting and dpd = 0 then do;
probation_count + 1;
probation_flag = 'Y';
rule = '2';
if probation_count > 10 then do;
probation_count = 0;
rule = '5';
end;
return;
end;
* pause counting for few dpd;
if pcounting and 0 < dpd <= 3 then do;
probation_flag = 'Y';
rule = '3';
return;
end;
* reset counting for high dpd;
if pcounting and dpd > 3 then do;
probation_count = 0;
probation_flag = 'Y';
rule = '4';
return;
end;
end;
else
if default_flag = 'Y' then do;
probation_count = 0;
probation_flag = 'N';
rule = '6';
end;
else do;
put 'ERROR: ' default_flag= _n_=;
stop;
end;
* drop trigger_counting pcounting;
run;
推荐阅读
- android - 水印大小因手机而异
- php - 基于查询字符串的htaccess重定向规则
- eclipse - 无法在 Eclipse 氧气中安装 glassfish 服务器
- android - Android Studio 3.1.3 不显示布局设计预览
- ios - 如何在 TableView 的 CollectionView 中获取图像的索引路径?
- javascript - 打字稿文件被 babel 转译后,要求路径不正确
- javascript - 防止 ngb-accordion 拖动,但仍允许文本突出显示
- javascript - 未捕获的 ReferenceError:Vue 未在 room.js:109 中定义
- java - 双整数值溢出
- javascript - 在 Angular js 中实现多选下拉菜单