宏与proc表格

时间:2017-01-19 22:04:53

标签: sas sas-macro

我想编写一个代码,在某些条件下将执行不同的proc表格。问题出在宏内部。没有改变,一切都运行得很好。 代码的想法很简单,但这是我第一次做出类似的东西。根据数据 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;

编辑:添加来自'回答'的信息,因为它不是答案。

代码应该像那样工作。 &amp; Cel和&amp; zmienna只是我想在proc制表过程中使用的变量,它们是在代码开头手动定义的。当'number'为&lt; 20时,我想只运行一次宏。在接下来的几个步骤中,我只使用proc格式准备数据,并创建一个表'Stat_for_&amp; cel',稍后将其用作proc制表过程中的数据。

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

3 个答案:

答案 0 :(得分:0)

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

%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);

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

没有任何参数定义宏没有任何问题。您只需引用宏代码中的宏变量并将其保留给宏的用户,以确保在调用宏之前定义了宏变量。

%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;