我有一个像下面这样的数据集,我正在尝试对事件 2 和 3 进行总计,但略有不同。我只想在 Event_1_dt 小于当前记录中的日期时计算这些事件。我目前正在使用宏 %do 循环来遍历该项目类型的每条记录。虽然这会产生预期的结果,但性能却比预期的要慢。每个 Item_Type 最多可以有 1250 条记录,并且有几千种类型。是否可以在循环完成所有 1250 次迭代之前退出循环?我对尝试加入犹豫不决,因为要统计大约 30 多个事件,但我愿意接受建议。另一个复杂情况是,即使 Event_1_dt 始终大于 Date,它也没有任何其他限制。
Item_Type Date Event_1_dt Event_2_flg Event_3Flg Desired_Event_2_Cnt Desired_Event_3_Cnt
A 1/1/2014 1/2/2014 1 1 0 0
A 1/2/2014 1/2/2014 0 1 0 0
A 1/3/2014 1/8/2014 1 0 1 2
B 1/1/2014 1/2/2014 1 0 0 0
B 1/2/2014 1/5/2014 1 0 0 0
B 1/3/2014 1/4/2014 1 1 1 0
B 1/4/2014 1/5/2014 0 1 1 0
B 1/5/2014 . 1 1 2 1
B 1/6/2014 1/7/2014 1 1 3 2
对应代码:
%macro History;
data y;
set x;
Event_1_Cnt = 0;
Event_2_Cnt = 0;
%do i = 1 %to 1250;
lag_Item_Type = lag&i(Item_Type);
lag_Event_2_flg = lag&i(Event_2_flg);
lag_Event_3_flg = lag&i(Event_3_flg);
lag_Event_1_dt = lag&i(Event_1_dt);
if Item_Type = lag_Item_Type and lag_Event_1_dt > . and lag_Event_1_dt < Date then do;
if lag_Event_2_flg = 1 then do;
Event_2_Cnt = Event_2_cnt + 1;
end;
if lag_Event_3_flg = 1 then do;
Event_3_Cnt = Event_3_cnt + 1;
end;
end;
%end;
跑;
%修补;
%历史;