【问题标题】:how to excute sas macro iteratively in another macro?如何在另一个宏中迭代执行 sas 宏?
【发布时间】:2014-01-29 01:37:46
【问题描述】:

我想获得brand_channel 宏的结果。 宏在 %do-loop 语句中不适用于 i=2,3,4。 如何迭代执行doing_scoring宏?

谢谢!

%doing_scoring;
...
...
...
%mend doing_scoring;

%macro brand_channel;
proc sql noprint;
    create table oneb_onec as
        select unique x1, x2  
           from mydata_all;
    quit;

data seq_oneb_onec;
set oneb_onec;
seqno = _N_;
run;

%let num=4;
%do i=1 %to  #
    %put doing number is &i;
    %put end doing number is #

proc sql noprint;
    create table onebc_table&i as
        select    a.* 
        from       mydata_all a, seq_oneb_onec b
        where    b.seqno = &i
            and    b.x1 = a.x1
            and    b.x2 = a.x2;
        quit;
%doing_scoring(mydata=onebc_table&i, setnumber = &i);
%end;

%mend brand_channel;

%brand_channel;

【问题讨论】:

  • 我假设您正在尝试创建 %doing_scoring() 宏?如果是这样,您需要将其定义为 %macro doing_scoring(); ... %mend; 而不是 %doing_scoring; ... %mend

标签: loops macros sas do-loops


【解决方案1】:

您的代码很好,除了初始行(doing_scoring 的声明),但我想这可能是转录错误。 下面我有一个功能测试版本。

但是,我有更好的方法来做同样的事情。从根本上说,宏观驱动的迭代是一个坏主意。几乎所有您可能想尝试的任务都有更好的方法来完成。

在这种情况下,您可以直接从 seq_ 数据集调用doing_scoring 调用,并将子数据集的创建移至宏(应该很容易),或者将数据集保持在一个整体中可能更好。

首先是更好的方法:调用执行。 (或者,您可以使用select into 在 SQL 中创建宏调用。)

proc sort data=sashelp.class out=class;
by age sex;
run;

%macro doing_scoring(data=,age=,sex=,setnumber=);
data mydata;
set class;
where age=&age. and sex="&sex.";
run;

*whatever else you are doing;
%mend doing_scoring;

data _null_;
set class;
by age sex;
if first.sex then seqno+1; 
callstr=cats('%doing_scoring(data=class,age=',age,',sex=',sex,',setnumber=',seqno,')');
call execute(callstr);
run;

现在,使用相同测试数据的原始方式。

%macro doing_scoring(mydata=,setnumber=);
%put doing_scoring &mydata. &setnumber.;
%mend doing_scoring;

%macro brand_channel;
proc sql noprint;
    create table oneb_onec as
        select distinct age,sex
           from sashelp.class;
    quit;

data seq_oneb_onec;
set oneb_onec;
seqno = _N_;
run;

%let num=4;
%do i=1 %to  #
    %put -------------------;
    %put doing number is &i;
    %put end doing number is #

proc sql noprint;
    create table onebc_table&i as
        select    a.* 
        from       sashelp.class a, seq_oneb_onec b
        where    b.seqno = &i
            and    b.age = a.age
            and    b.sex = a.sex;
        quit;
%doing_scoring(mydata=onebc_table&i, setnumber = &i);
%put -------------------;
%end;

%mend brand_channel;

%brand_channel;

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多