如何为循环SAS中的datastep中的宏赋值

如何为循环SAS中的datastep中的宏赋值,sas,sas-macro,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。在同一数据步骤中,我将使用var1对数组进行索引 您可以将呼叫密码更改为: call symput(compress('va

所以我试着这样做:

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。在同一数据步骤中,我将使用var1对数组进行索引

您可以将
呼叫密码更改为:

 call symput(compress('var'||put(i,8.)), put(i,8.));
我还在
symput
的第二个参数周围包装了一个
put()
,以清理日志消息

(不过,这似乎是一种奇怪的模式。如果你在动态创建大量宏观变量,你可能会重新思考你的总体战略,并想出一些更简单的方法。)


Edit:关于使用
symput
创建的SAS变量在同一数据步骤中不可用,Nate有一个很好的观点。如果您仍然想使用此解决方案,可以在“temp1”步骤之前将
symput
循环移动到
\u null\u
数据步骤中。

这里有一些问题

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

另一个问题是,当您编写代码时(以及在您的描述中),您将重新编写“var1”10次……您不想要&var1&变量2&var10?如果是这样的话,我会推荐如下:

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

最后,如果数组声明只需要这些宏变量,为什么还要在这里使用宏变量?为什么不干脆把x_1写到x_10呢?如果您能向我们提供更多有关您正努力实现的目标的信息,我们可能会为您提供更好的策略。

这也行!。我的实际问题是:例如,我按年龄对sashelp数据集进行排序,我试图找到每个年龄组的最大年龄。你能在这方面帮助我吗?我不确定我是否完全理解你试图实现的目标,但我不认为这是一个你需要或想要任何宏代码的问题。也许开始一个新的问题,在那里你概述了你试图解决的更广泛的问题?请看这个。它太长,不能作为评论。非常感谢。