如何在SAS宏的DO循环中传入两个动态日期参数?
解决SAS宏循环传入两个动态日期参数的问题
情况1:相邻日期配对(如第i个日期和第i+1个日期比较)
不需要额外添加独立的%DO j循环,直接在现有循环中通过%eval(&i+1)获取下一个日期对应的宏变量即可,修改后的代码如下:
%MACRO APPLY_TEST; %DO i = 4 %to 27 %by 1; %test (date1=&MMMYY&&i., date2=&MMMYY%eval(&i+1)); %end; %mend; %APPLY_TEST;
代码说明
&MMMYY&&i.:解析为&MMMYY4、&MMMYY5…&MMMYY27,获取当前循环对应的日期值(如Sep23)。&MMMYY%eval(&i+1):先通过%eval(&i+1)计算出下一个索引(如i=4时得到5),再解析为&MMMYY5,获取对应的下一个日期值(如Oct23)。
情况2:所有两两日期组合(如第i个日期和所有后续日期比较)
如果需要生成所有不重复的两两日期配对,就需要嵌套%DO j循环,让j从i+1开始遍历到28,代码如下:
%MACRO APPLY_TEST; %DO i = 4 %to 27 %by 1; %DO j = %eval(&i+1) %to 28 %by 1; %test (date1=&MMMYY&&i., date2=&MMMYY&&j.); %end; %end; %mend; %APPLY_TEST;
注意事项
原%test宏每次执行都会覆盖WANT数据集,最终只会保留最后一次循环的结果。如果需要保留所有比较结果,建议修改%test宏,给输出数据集添加日期标识:
%macro test (date1, date2); DATA WANT_&date1._&date2.; SET HAVE; IF INPUT_&DATE1. > INPUT_&DATE2. THEN R_&DATE1. = 1; ELSE R_&DATE2. = 0; RUN; %MEND;
这样每次生成的数据集名为WANT_日期1_日期2(如WANT_Sep23_Oct23),避免数据覆盖。
内容的提问来源于stack exchange,提问作者MLPNPC
相关产品推荐
相关产品推荐

