【问题标题】:Get values of Macro Variables in a SAS Table获取 SAS 表中宏变量的值
【发布时间】:2016-02-23 15:55:02
【问题描述】:

我在 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;

感谢您的帮助。

杰

【问题讨论】:

    标签: sas sas-macro enterprise-guide sas-stored-process


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

    【讨论】:

    • 谢谢瑞萨。工作得很好。感谢您的帮助。
    【解决方案2】:

    我认为真正的问题是存储过程的不一致行为。它仅在有多个选择时创建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 $32 value $200 ;
      do i=1 to &&&name.0 ;
        var=cats(symget('name'),i);
        value=symget(var);
        output;
      end;
    run;
    

    【讨论】:

      【解决方案3】:

      我不了解您的编号方案,如果可以的话,建议您更改它; &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;
      

      【讨论】:

      • 变量模式看起来像 SAS 的 Web 界面返回用户选择的方式。我还看到它只返回一个变量,根本不创建 _0 变量。
      • @Tom 嗯,那很奇怪。为什么“第一个”是&var_ 而不是&var_1??
      • 不确定,我认为逻辑是这样的。如果您将该字段定义为 MONTH 并且它不是多选,则获取一个名为 MONTH 的变量。所以他们想在多选时也返回一个变量名 MONTH。我已经很多年没有看过它了,但我认为它同时成为了 MONTH 和 MONTH1。但也许是我的代码添加了 MONTH1,因为它看起来很奇怪。
      • 谢谢乔。工作得很好。感谢你的帮助。汤姆是对的。命名约定略有不同。第一个变量将在 VAR_ 和 VAR_1 下。如果只选择了一个值,那么将只有一个变量,即 VAR_。
      • 如果是这种情况(如果 VAR_1 = VAR),那么您将不需要 I-1 位或 IFC 位。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多