以下是一些C代码。我如何在sas中做同样的事情?
For(i=30, j=1; i<=41, j<=12; i++, j++)
(
closure(i,j) /*calling function with input parameters I and j */
);
我基本上想要使用带有两个计数器I和J
的循环来执行以下宏调用%closure(30,201201);
%closure(31,201202);
%closure(32,201203);
%closure(33,201204);
%closure(34,201205);
%closure(35,201206);
%closure(36,201207);
%closure(37,201208);
%closure(38,201209);
%closure(39,201210);
%closure(40,201211);
%closure(41,201212);
请注意,我不想使用嵌套循环。 提示表示赞赏。
答案 0 :(得分:2)
在SAS中执行此操作取决于数据的结构。可以这样做:
%do i = 1 to 12;
%closure(%eval(29+i),%eval(201200+i));
%end;
这有点奇怪,但它应该可以正常工作。
您也可以在%闭包宏中执行此操作。通过i,然后确定宏中其他参数的值,如果它们始终具有此关系。如果他们总是有某些关系,但2012和18部分是可变的,那么你有几个选择:
在此步骤之前将2012和29定义为宏变量,并在代码中替换它们。
%let year=2012;
%let startrec=29;
%do i = 1 to 12;
%closure(%eval(&startrec.+&i.),%eval(&year.00+&i.));
%end;
使用日期函数来确定j的值,如果它不总是01-12。
%closure(30,%sysfunc(intnx(month,'01JUN2011'd,&i.-1)))
(您可能希望以YYYYMM格式格式化结果,或者您也可以使用日期结果,具体取决于%闭包)
在数据集中定义所有这些术语,并从数据集中调用宏。
data to_call;
input i j;
datalines;
30 201201
31 201202
.... ;
run;
proc sql;
select cats('%closure(',i,',',j,')') into :calllist separated by ' ' from to_call;
quit;
&calllist.
这是一种更为'SAS'的做事方式,使流程数据得以驱动。当i和j参数作为数据元素存储在某处时(例如,在控制表中,或从某些其他数据源派生),最常用。
答案 1 :(得分:1)
所以如果你想要
那么你要么更好地计算J的价值并将其带到201200附近。 或者你应该用201201开始j循环并结束它到201212 只需去
For(i = 30,j = 201201; i <= 41,j <= 201212; i ++,j ++)
(
closure(i,j)
);