Loops 带两个计数器的循环

Loops 带两个计数器的循环,loops,sas,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 */ ); 请注意,我不想使用嵌套循环。 小费是感激的 如果你想的话 %关闭(30201201) %关闭(31201202) %关闭(3220203) %关闭(33201204) %关闭(34201205

下面是一些C代码。如何在sas中执行相同的操作

 For(i=30, j=1; i<=41, j<=12; i++, j++)
    (
    closure(i,j) /*calling function with input parameters I and j */
    );
请注意,我不想使用嵌套循环。 小费是感激的

如果你想的话

  • %关闭(30201201)
  • %关闭(31201202)
  • %关闭(3220203)
  • %关闭(33201204)
  • %关闭(34201205)
  • %关闭(35201206)
  • %关闭(36201207)
  • %关闭(37201208)
  • %关闭(38201209)
  • %关闭(39201210)
  • %关闭(40201211)
  • %关闭(41201212)
然后,最好是计算J的值,并将其调到201200 aur左右。 或者您应该从201201开始j循环,并将其结束到201212 干脆去


对于(i=30,j=201201;i在SAS中执行此操作取决于数据的结构。可以执行以下操作:

%do i = 1 to 12;
  %closure(%eval(29+i),%eval(201200+i));
%end;
这有点奇怪,但它应该可以正常工作

您也可以在%closure宏中执行此操作。传递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;
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.
如果j的值不总是01-12,则使用日期函数确定其值。

%closure(30,%sysfunc(intnx(month,'01JUN2011'd,&i.-1)))
(您可能希望将结果格式化为YYYYMM格式,或者您也可以使用日期结果,具体取决于%Close)

在数据集中定义所有这些术语,并从数据集中调用宏。

%let year=2012;
%let startrec=29;
%do i = 1 to 12;
  %closure(%eval(&startrec.+&i.),%eval(&year.00+&i.));
%end;
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参数作为数据元素存储在某个位置时(例如,在控制表中,或从其他数据源派生).

模糊的主题行不太可能有助于未来的访问者回答相同的问题。您甚至没有标记问题[sas]!请参见DO循环中的变体:DO WHILE和DO UNTIL