循环有两个计数器

时间:2013-04-04 13:28:38

标签: loops sas

以下是一些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);

请注意,我不想使用嵌套循环。 提示表示赞赏。

2 个答案:

答案 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)

所以如果你想要

  • %封闭件(30,201201);
  • %封闭件(31,201202);
  • %封闭件(32,201203);
  • %封闭件(33,201204);
  • %封闭件(34,201205);
  • %封闭件(35,201206);
  • %封闭件(36,201207);
  • %封闭件(37,201208);
  • %封闭件(38,201209);
  • %封闭件(39,201210);
  • %封闭件(40,201211);
  • %封闭件(41,201212);

那么你要么更好地计算J的价值并将其带到201200附近。 或者你应该用201201开始j循环并结束它到201212 只需去

For(i = 30,j = 201201; i <= 41,j <= 201212; i ++,j ++)

  closure(i,j) 

);