【问题标题】:Macro with proc tabulate带有 proc 列表的宏
【发布时间】:2017-01-19 22:04:53
【问题描述】:

我想编写一个代码,在特定条件下将执行不同的 proc tabulate。问题出在宏内部的某个地方。没有改变一切都很好。 代码的想法很简单,但这是我第一次做这样的事情。根据数据 makro 中的 x 值,将执行不同的宏。不知道宏里面应该怎么定义变量。

data makro;
set number;
if number < 20 then x=1; 
else x=2;
run;

  proc format;
value temp 70- HIGH='red';
run;

PROC SQL;
   CREATE TABLE Stat_for_&cel AS 
   SELECT distinct t1.&zmienna, 
          t1.&cel,
t2.number,
               (COUNT(t1.cid)) AS ILE
      FROM zrodlo.abt_app t1 left join ile_zmiennych t2 on t1.&zmienna=t2.&zmienna where t1.&zmienna not is missing 
      GROUP BY t1.&zmienna,
               t1.&cel
      ORDER BY t1.&zmienna DESC;
QUIT;

%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);

proc format;
value temp 70- HIGH='red';
run;

PROC TABULATE
DATA= &&Stat_for_&cel format=commax10.2 ; 

    VAR &&ILE;

    CLASS &&zmienna/ MISSING;
    CLASS &&cel/ MISSING;

    TABLE 

    /* Row Dimension */
&&cel,
/* Column Dimension */
&&ILE*  ColPctSum*    &&zmienna*[style=[background=temp.]];

RUN;
%mend tabelka1; 

data makro_2;
set makro;
if x=1 then call execute ('%tabelka1');
run;

编辑:从“答案”中添加信息,因为它不是答案。

代码应该这样工作。 &Cel 和 &zmienna 只是我想在 proc 制表过程中使用的变量,它们是在代码开头手动定义的。当“数字”

我相信,主要问题在 %macro tabelka1 内部。我不知道我应该如何在宏中实现变量 &cel 和 &zmienna。

【问题讨论】:

  • 很遗憾,您的问题不够清楚,无法理解您要寻求帮助的具体内容。
  • 示例输入和输出数据会有所帮助。如果 MAKRO 中有多个满足条件 X=1 的观察值,您是否要多次运行宏?或者,如果任何观察结果 X=1,您是否只想运行一次?或者也许只有当所有观测值都有 X=1 时?
  • 这是我如何编写宏的示例。在代码的底部有执行宏的示例代码。注意cmets中的参数列表和用法。

标签: sas sas-macro


【解决方案1】:

我认为您在宏定义中混淆了参数,然后是实际用法。您错误地定义了宏。而不是:

%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);

应该是:

%macro tabelka1(Statystyka_dla_cel,ILE,cel,zmienna);

然后当你调用宏或者尝试使用它时,就可以传递宏变量了。

%tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);

就个人而言,我更喜欢使用 = 符号来帮助突出参数名称和所使用的值之间的区别。这是一个简单的例子:

 %macro print_vars(dsin= , vars= );

 proc print data=&dsin;
 var &vars;
 run;

 %mend;

然后您可以将宏称为:

%print_vars(dsin=sashelp.class, vars= name age);

【讨论】:

    【解决方案2】:

    清楚地了解各种术语的含义非常重要。宏变量是一个数据存储位置,具有名称和值。宏变量名称类似于 'ile'、'cel' 等。但请注意,宏变量的名称不包含 & 符号!有多种方法可以访问宏变量的值,所有这些方法都涉及使用其名称。最常见的方法是使用 &amp;&lt;macro variable name&gt;,但您也可以使用(在数据步骤中)x = symget('&lt;macro variable name&gt;'),例如 - 这里没有与号。

    【讨论】:

      【解决方案3】:

      在没有任何参数的情况下定义宏并没有错。您可以只在宏代码中引用宏变量并将其留给宏的用户,以确保在调用宏之前定义宏变量。

      %macro tabelka1;
      proc format;
      value temp 70- HIGH='red';
      run;
      
      PROC TABULATE DATA=Stat_for_&cel format=commax10.2 ; 
        VAR &ILE;
        CLASS &zmienna/ MISSING;
        CLASS &cel/ MISSING;
        TABLE &cel,&ILE*ColPctSum*&zmienna*[style=[background=temp.]];
      RUN;
      %mend tabelka1;
      

      然后有条件地调用宏,您可以使用数据步骤。

      data _null_;
        set makro;
        if x=1;
        call execute('%nrstr(%tabelka1);');
        stop;
      run;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-21
        相关资源
        最近更新 更多