【问题标题】:Dynamic macro variable access SAS动态宏变量访问 SAS
【发布时间】:2018-06-18 17:24:01
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么要使用宏变量?在尝试使用宏处理器为您生成 SAS 代码之前,您应该先坚持学习 SAS。如果您使用了call symputx(),那么您必须已经在数据集中拥有数据,只需再次使用该数据集即可。
  • @Tom 我需要在数据集中创建新列以应用一些规则。每次程序运行时所需的列数都会有所不同,因此需要保持一些命名约定来循环,这就是我尝试使用数组的原因。不知道如何将数组分配给一行的值,这就是为什么我试图创建一个宏变量列表然后让数组引用它们。 -- 基本上,如果有 5 样东西,我需要向数据集添加 5 列,并且第 1 列具有事物 1 的值,第 2 列具有事物 2 的值,等等。
  • @S420L Tom 的意思是您不应该为此使用宏变量。数组很好 - 非常明智 - 但宏变量不是这个的正确位置。使用 MERGE 合并具有此信息的数据集,然后使用数组或其他方式。如果您需要有关如何处理它的建议,请随时提出更多细节的问题。最好以原始数据和想要的结果为例。

标签: loops sas sas-macro


【解决方案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;

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

【讨论】:

  • 谢谢!我现在正在尝试第二个选项,因为尽管第一个选项确实运行并生成了一个数据集,但它不会将宏变量的值分配给数组,而是将宏变量的列的名称分配给数组。我为每个宏变量(Rule1、Rule2 等)保存了一列,其中包含值(R1、R3、R5、R7 等),当我使用方法 1 时,结果数据集多次显示“Rule1”。这与我将例如 &Item1 分配给数组中的某个点不同,它会给我(R1、R3 等)
  • &item1 包含您要在此处分配的变量名称,而不是实际值?那么你可能想使用第二个选项,是的,比第一个更简单。
  • &Item1 包含来自另一个数据集的列。出于某种原因,当使用 symget 时,它会评估为以前的变量名,我不确定为什么
  • 第二种方法似乎有效,谢谢!很抱歉,我是一个菜鸟,SAS 对我来说有点奇怪,我来自 SQL/C/Java,这些东西通常一起玩得更好。
【解决方案2】:

如果您有如下数据集:

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;

【讨论】:

  • 我不会把这个答案放在这个问题上 - 你可能是对的,它回答了实际需要,但是应该直接回答这个问题(为什么 OP 所做的事情不起作用),并且 OP应该问一个新问题以了解如何正确地做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多