获取 SAS 中宏变量的值 Table
Get values of Macro Variables in a SAS Table
我在 SAS 中有一组输入宏变量。它们是动态的,根据用户 selection 在 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 个提供值。
注意:如果用户select只有一个值,那么只会创建一个宏变量。例如如果用户 selects 9 那么 &var_=9;将被创建。不会有任何计数宏变量。
我正在尝试使用这些变量创建一个 sas table。
应该是这样的
OBS VAR
-----------
1 2
2 5
3 7
-----------
这是我试过的。不确定这是否是处理它的正确方法。
它没有给我最终的解决方案,但我至少可以在 table 中获得宏变量的名称。我怎样才能得到他们的价值?
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;
感谢您的帮助。
周杰伦
SAS 已经帮助您将它们存储在 table 中,您只需要解析出您想要的那些。 table 称为 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;
我不明白你的编号方案,如果可以,建议更改它; &var_
变量非常混乱。
无论如何,最简单的方法是 SYMGET
。 returns 来自宏符号 table 的值,您可以在运行时指定它。
%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;
我认为真正的问题是存储过程的不一致行为。它只在有多个选择时创建 0
和 1
变量。我认为你的例子有点不对劲。如果 VAR_0
的值为 3 那么它们应该是一个 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 value 0 ;
do i=1 to &&&name.0 ;
var=cats(symget('name'),i);
value=symget(var);
output;
end;
run;
我在 SAS 中有一组输入宏变量。它们是动态的,根据用户 selection 在 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 个提供值。
注意:如果用户select只有一个值,那么只会创建一个宏变量。例如如果用户 selects 9 那么 &var_=9;将被创建。不会有任何计数宏变量。 我正在尝试使用这些变量创建一个 sas table。
应该是这样的
OBS VAR
-----------
1 2
2 5
3 7
-----------
这是我试过的。不确定这是否是处理它的正确方法。 它没有给我最终的解决方案,但我至少可以在 table 中获得宏变量的名称。我怎样才能得到他们的价值?
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;
感谢您的帮助。
周杰伦
SAS 已经帮助您将它们存储在 table 中,您只需要解析出您想要的那些。 table 称为 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;
我不明白你的编号方案,如果可以,建议更改它; &var_
变量非常混乱。
无论如何,最简单的方法是 SYMGET
。 returns 来自宏符号 table 的值,您可以在运行时指定它。
%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;
我认为真正的问题是存储过程的不一致行为。它只在有多个选择时创建 0
和 1
变量。我认为你的例子有点不对劲。如果 VAR_0
的值为 3 那么它们应该是一个 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 value 0 ;
do i=1 to &&&name.0 ;
var=cats(symget('name'),i);
value=symget(var);
output;
end;
run;