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(¤t_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., ¤t_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
我是 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(¤t_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., ¤t_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