我试图将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很陌生,并且理解你可以像其他语言一样强制逻辑,但如果有办法做到这一点,我会很感激指导。
答案 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'。如果您希望宏变量解析为字符串,您可以添加引号,但根据您的问题,这似乎不正确。