动态宏变量访问SAS

时间:2018-06-18 17:24:01

标签: loops sas sas-macro

我使用调用symputx来创建宏变量列表项目1到项目N现在我想将它们转移到另一个datastep中的数组,以便数组中的点1获得Item1,点2获得Item2等等。

    do j=1 to &num_OR;
    rulesUsed{j}=&&Item&j;
    end;

我读到双&符号语法是引用像这样的宏变量的方法,但我不断得到各种错误。我确定这是一个简单的解决方法,但我是SAS的新手,并且我没有通过搜索提到的文件提到了这种确切类型的问题。

2 个答案:

答案 0 :(得分:1)

简短的回答是:一般来说,不要这样做。宏变量不是存储数据的好方法,而且几乎总是有更好的方法。

但是如果你需要,你的问题是宏变量不能使用数据步变量。

 do j=1 to &num_OR;
    rulesUsed{j}=&&Item&j;
 end;

j是数据步变量,而不是宏变量,因此它不是&j。你需要:

1 - 使用symget检索宏变量。这是一个数据步骤函数,它接受一个普通的数据步骤字符参数(所以变量,一个“”字符串等)并返回带有该名称的宏变量。所以

rulesUsed[j] = symget(cats("item",j));

2 - 使用宏循环检索宏变量。

%do j = 1 %to &num_or;
  rulesUsed[&j.] = &&item&j;
%end;

这两种方法都可以正常工作。

答案 1 :(得分:0)

如果您有如下数据集:

data have ;
  ruleno+1;
  input rule $20. ;
cards;
Value1
Value2
Value3
;

您可以使用PROC TRANSPOSE将其转换为广角。

proc transpose data=have out=want(drop=_name_) prefix=rulesUsed ;
  var rule;
  id ruleno;
run;

enter image description here