SAS - 使用循环调用具有不同参数的宏

SAS - Using a loop to call a macro with different parameters

我是 SAS 的新手,我正在尝试自动执行使用不同参数调用宏的过程。

这是我要调用的宏。

%macro expo(month, year);                                          
    data policy_&month&year;
        set lastpol2;
        by policy_no;
        drop uwmonth;
        accidentmonth = &month&year;      
run;
%mend;

我从2016年开始每个月每年都需要调用这个宏,所以目前的方法就是简单的多次调用这个宏


%expo(1,2016);
%expo(2,2016);
%expo(3,2016);
%expo(4,2016);
%expo(5,2016);

...
...

%expo(10,2021);
%expo(11,2021);
%expo(12,2021);

我不想创建这么长的列表,而是想创建一个循环来获取当前年份并遍历每年的每个月。我的方法是编写一个宏,用不同的参数多次调用另一个宏,这是我目前的尝试。

%macro create_policies();
    %let current_year = year(input("&sysdate9",date9.));
    %let policy_start_year = 2016;
    %if policy_start_year <= current_year %then
        %do i = 1 %to 12;
            %expo(&i, &policy_start_year);
        %end;
        %let policy_start_year = &policy_start_year + 1;

run;
%mend;

%create_policies()

所以我尝试循环 1 到 12 并在循环中每次使用数字调用宏。达到索引 12 后,我希望将年份更改为下一年并重复该过程,直到完成当年。

任何帮助或指点都会很棒。

谢谢。

你走在正确的轨道上。 SAS 有一个名为 intnx() 的内置函数,它可以移动日期和时间以简化此操作。将您的年份转换为 SAS 日期,但将当前年份对齐到 12 月,将开始年份对齐到 1 月:

%let policy_start_year = %sysfunc(mdy(1, 1, 2016));
%let current_year      = %sysfunc(intnx(year, %sysfunc(today()), 0, E));

%put Start date: %sysfunc(putn(&policy_start_year, date9.));
%put End date: %sysfunc(putn(&current_year, date9.));

输出:

Start date: 01JAN2016
End date: 31DEC2021

对于这个目的,一个月中的实际日期本身并不重要。

使用intck()函数计算开始日期和结束日期之间的月数,然后循环并每次递增开始日期一个月,直到到达结束日期。例如,如果您从 01JAN2016 开始,从开始日期算起 1 个月是 01FEB2016,从开始日期算起 2 个月是 01MAR2016,等等。您可以使用 month()year() 个函数。

%macro create_policies(start_year);
    %let current_year      = %sysfunc(intnx(year, %sysfunc(today()), 0, E));
    %let policy_start_year = %sysfunc(mdy(1, 1, &start_year.));

    %do i = 0 %to %sysfunc(intck(month, &policy_start_year., &current_year.) );
        %let date  = %sysfunc(intnx(month, &policy_start_year., &i.) );

        %let month = %sysfunc(month(&date.));
        %let year  = %sysfunc(year(&date.));

        %put date: %sysfunc(putn(&date., date9.)) | year: &year. | month: &month.;

        %expo(&month., &year.);
    %end;

%mend;

%create_policies(2016);

输出:

date: 01JAN2016 | year: 2016 | month: 1
date: 01FEB2016 | year: 2016 | month: 2
date: 01MAR2016 | year: 2016 | month: 3
date: 01APR2016 | year: 2016 | month: 4
...
date: 01NOV2020 | year: 2020 | month: 11
date: 01DEC2020 | year: 2020 | month: 12
date: 01JAN2021 | year: 2021 | month: 1
date: 01FEB2021 | year: 2021 | month: 2
...
date: 01SEP2021 | year: 2021 | month: 9
date: 01OCT2021 | year: 2021 | month: 10
date: 01NOV2021 | year: 2021 | month: 11
date: 01DEC2021 | year: 2021 | month: 12