【发布时间】:2014-02-16 02:21:18
【问题描述】:
我有一个像下面这样的数据集,我正在尝试对事件 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;
运行;
%修补;
%历史;
【问题讨论】:
-
绝对不要在宏中这样做。另外,您是否知道延迟与您在
IF语句中的想法不同? -
我回家后会在几个小时内给出详细的建议,但总的来说,运行总计可以通过多种方式完成,散列、连接、合并或仅使用
retain;比那种宏循环更有效。 -
您在示例数据中使用什么日期格式?是 mm-dd-yyyy 还是 dd-mm-yyyy?
标签: macros sas do-loops datastep