我有2个SAS宏循环 - 1个用于创建时间序列数据集,另一个用于将数据集附加到主数据集中。宏Date_loop1创建时间序列数据集。在这个例子中,我正在创建虚拟……
打开MPRINT选项以查看宏生成的代码。第二个是生成如下代码:
MPRINT(DATE_LOOP2): data master_rollrate; MPRINT(DATE_LOOP2): set rollrate_201901_201901; NOTE: Line generated by the macro variable "ED_YYYYMM". 1 rollrate_201901_201902 ---------------------- 180 MPRINT(DATE_LOOP2): rollrate_201901_201902; NOTE: Line generated by the macro variable "ED_YYYYMM". 1 rollrate_201902_201902 ---------------------- 180 MPRINT(DATE_LOOP2): rollrate_201902_201902; MPRINT(DATE_LOOP2): ; MPRINT(DATE_LOOP2): run;
删除嵌套中间的额外分号 %do 循环,因为您只在这些循环中生成语句的PART。
%do
您可以使用信息和格式将YYYYMM数字字符串与实际日期值进行转换,从而大大简化宏代码。
%macro date_loop2(start,end); %local start_date end_date dif i j st_yyyymm ed_yyyymm; %let start_date = %sysfunc(inputn(&start.01,yymmdd8)); %let end_date = %sysfunc(inputn(&end.01,yymmdd8)); %let dif=%sysfunc(intck(month,&start_date,&end_date)); data master_rollrate; set %do i=0 %to &dif; %do j=&i %to &dif; %let st_yyyymm = %sysfunc(intnx(month,&start_date,&i,b),yymmn6); %let ed_yyyymm = %sysfunc(intnx(month,&start_date,&j,b),yymmn6); rollrate_&st_yyyymm._&ed_yyyymm %end; %end; ; run; %mend date_loop2;
您可以在中使用名称列表 SET 声明并完全避免宏观。
SET
名称以其开头的每个数据集 rollrate 将被堆叠:
rollrate
data want; set work. rollrate:; run;
我目前看到两个问题
第二个循环的%修补是date_loop1而不是date_loop2(第二行代码)
%MEND DATE_LOOP1; / 应该是DATE_LOOP2 /
%DATE_LOOP2(201901,201902);
请在date_loop2宏中的ROLLRATE_& START_YYYYMM ._& END_YYYYMM之后删除分号,因为有一个;结束陈述后