动态宏变量访问 SAS

Dynamic macro variable access SAS

我已经使用调用 symputx 创建了一个宏变量列表 Item 1 到 Item N,现在我想将它们传输到另一个数据步骤中的数组,以便数组中的点 1 获取 Item1,点 2 获取 Item2等

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

我读到双符号语法是引用宏变量的方式,但我不断收到各种错误。我确信有一个简单的方法可以解决这个问题,但我是 SAS 的新手,而且我阅读过的搜索中出现的文档都没有提到这种确切类型的问题。

简短的回答是:一般情况下不要这样做。宏变量不是存储数据的好方法,但几乎总有更好的方法。

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

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

j是数据步变量,不是宏变量,所以不是&j。您需要:

1 - 使用 symget 检索宏变量。这是一个数据步函数,它采用普通数据步字符参数(例如变量、“”字符串等)和 returns 具有该名称的宏变量。所以

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

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

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

这两种方法都可以。

如果您有如下数据集:

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

您可以使用 PROC TRANSPOSE 将其转换为宽屏。

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