如何在SAS中使用特定观察的呼叫交流

时间:2018-06-18 20:03:18

标签: sas sas-macro do-loops

我试图将SAS数据集列转换为宏变量列表,但不确定索引在这种语言中的工作原理。

    DATA _Null_;
       do I = 1 to &num_or;
       set CondensedOverrides4 nobs = num_or;
       call symputx("Item" !! left(put(I,8.))
       ,"Rule", "G");
    end;
    run;

现在,这段代码创建了一个宏变量Item1,Item2,.. ItemN等列表,并分配了名为" Rule"的整个列。每个新变量。我的目标是首先观察"规则"在Item1中,Item2中该列的第二个观察,等等。

我对SAS很陌生,并且理解你可以像其他语言一样强制逻辑,但如果有办法做到这一点,我会很感激指导。

2 个答案:

答案 0 :(得分:1)

使用PROC SQL的{​​{1}}子句创建一系列宏变量要容易得多。您可以将项目数保存到宏变量中。

INTO

如果要使用数据步骤,则不需要proc sql noprint; select rule into :Item1- from CondensedOverrides4 ; %let num_or=&sqlobs; quit; 循环。数据步骤自动迭代输入。在输入数据集为空的情况下,在set语句之前放置代码以将观察数保存到宏变量中。

DO

答案 1 :(得分:0)

SAS不需要循环来访问每一行,它会自动执行。所以你的代码非常接近。而不是我,使用自动变量_n_,它可以作为行计数器,虽然它实际上是一个步数计数器。

DATA _Null_;
   set CondensedOverrides4;
   call symputx("Item" || put(_n_,8. -l) , Rule, "G");
run;

老实说,如果你不推荐使用宏变量开始使用SAS,那么通常有多种方法可以避免它,如果没有,我只会使用它。其他选择。它非常强大,但容易出错并且难以调试。

编辑:我修改了代码以删除LEFT()函数,因为您可以在PUT语句中使用-l选项直接对齐结果。

EDIT2:删除RULE周围的引号,因为我怀疑它是一个你想要存储值的变量,而不是文本字符串' RULE'。如果您希望宏变量解析为字符串,您可以添加引号,但根据您的问题,这似乎不正确。