1

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

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

4

2 回答 2

2

在 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;

使用日期函数来确定 j 的值,如果它不总是 01-12。

%closure(30,%sysfunc(intnx(month,'01JUN2011'd,&i.-1)))

(您可能希望将结果格式化为 YYYYMM 格式,或者您可能也可以使用日期结果,具体取决于 %closure)

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

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 参数作为数据元素存储在某处(例如,在控制表中,或从某些其他数据源派生)时最常用。

于 2013-04-04T17:39:47.043 回答
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 aur 附近。或者您应该以 201201 开始 j 循环并以 201212 结束它,只需执行

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

(

  closure(i,j) 

);

于 2013-04-04T13:42:48.590 回答