如何在循环SAS中的数据步骤中为宏分配值

时间:2014-03-10 16:25:23

标签: sas sas-macro

所以我想尝试做这样的事情:

data temp1;
   set temp;
   do i=1 to 10;
     call symput("var1", i);
   end;

 array x(*) x_&var1 to x_&var10;
    ....................


run;

我试图将i(1到10)的值赋给宏变量var1。在同一个datastep中,我将使用var1来索引数组。

2 个答案:

答案 0 :(得分:1)

您可以将call symput更改为此:

 call symput(compress('var'||put(i,8.)), put(i,8.));

我还在put()的第二个参数周围打了一个symput来清理日志消息。

(这看起来确实是一种奇怪的模式。如果你动态创建了很多宏变量,你可能会重新考虑你的整体策略并提出更简单的方法。)

编辑:Nate对使用symput创建的SAS变量不能在同一个datastep中使用有一个很好的观点。如果您仍想使用此解决方案,可以在“temp1”步骤之前将symput循环移动到_null_ datastep。

答案 1 :(得分:0)

这里有一些问题。

一个是您不能同时使用call symput创建一个宏变量并在同一个数据步骤中引用它,因此除非您将其拆分为多个数据步骤,否则调用symput的任何变化都无法解决。

另一个原因是,当您编写代码(并在您的描述中)时,您将重写“var1”10次...不要反而想要& var1。 ,& var2。 ,...,& var10。 ?如果是这样,我建议像:

call symput('var'||left(i),i);

最后,如果您只需要这些宏变量用于数组声明,为什么还需要在这里使用宏变量?为什么不简单地将x_1写入x_10?也许如果你给我们提供更多关于你想要实现的目标的信息,我们可以为你提供更好的策略。