3

我在 SAS 中有一组输入宏变量。它们是动态的,并且基于 sas 存储过程中的用户选择而生成。

For example:There are 10 input values 1 to 10.
The name of the macro variable is VAR_. If a user selects 2,5,7 then 4 macro variables are created. 
&VAR_0=3;
&VAR_=2;
&VAR_1=5;
&VAR_2=7;

后缀为 0 的第一个提供计数。接下来的 3 提供了值。

注意:如果用户只选择一个值,则只创建一个宏变量。例如,如果用户选择 9,则 &var_=9; 将被创建。不会有任何计数宏变量。我正在尝试使用这些变量创建一个 sas 表。

应该是这样的

OBS    VAR
-----------
1      2
2      5
3      7
-----------

这是我尝试过的。不确定这是否是处理它的正确方法。它没有给我最终的解决方案,但我至少可以在表格中获取宏变量的名称。我怎样才能得到他们的价值观?

data tbl1;
do I=1 to &var_0;
VAR=CAT('&VAR_',I-1);
OUTPUT;
END;
RUN;
PROC SQL;
CREATE TABLE TBL2 AS 
SELECT I,
CASE WHEN VAR= '&VAR_0' THEN '&VAR_' ELSE VAR END AS VAR
from TBL1;
QUIT;

感谢您的帮助。

周杰伦

4

3 回答 3

1

SAS 已经帮助您将它们存储在一个表中,您只需要解析出您想要的那些。该表称为 SASHELP.VMACRO 或 DICTIONARY.MACROS

这是一个例子:

%let var=1;
%let var2=3;
%let var4=5;

proc sql;
create table want as
select * from sashelp.vmacro
where name like 'VAR%';
quit;

proc print data=want;
run;
于 2016-02-23T16:15:11.823 回答
1

我认为真正的问题是存储过程的不一致行为。它仅在有多个选择时创建0and变量。1我认为你的例子有点不对劲。如果值为VAR_03,那么它们应该是一个VAR_3宏变量。和的值VAR_VAR_1应该设置为相同的值。

为了在过去解决这个问题,我做了类似的事情。首先让我们为参数名称分配一个宏变量,以便代码可重用于其他程序。

%let name=VAR_;

然后首先确保最小的宏变量存在。

%global &name &name.0 &name.1 ;

0然后通过在变量为空时将变量设置为 1 来确保您有一个计数。

%let &name.0 = %scan(&&&name.0 1,1);

然后确保你有一个1变量。因为它应该与没有后缀的宏变量具有相同的值,所以只需重新分配它。

%let &name.1 = &&&name ;

现在您的数据步骤更容易了。

data want ;
  length var $32 value $200 ;
  do i=1 to &&&name.0 ;
    var=cats(symget('name'),i);
    value=symget(var);
    output;
  end;
run;
于 2016-02-23T17:02:27.007 回答
0

我不明白您的编号方案,如果可以的话,建议您更改它;这个&var_变量非常混乱。

无论如何,最简单的方法是SYMGET. 从宏符号表中返回一个值,您可以在运行时指定该值。

%let VAR_0=3;
%let VAR_=2;
%let VAR_1=5;
%let VAR_2=7;

data want;  
  do obs = 1 to &var_0.;
    var = input(symget(cats('VAR_',ifc(obs=1,'',put(obs-1,2.)))),2.);
    output;
  end;
run;
于 2016-02-23T16:18:16.810 回答