0

我想得到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;
4

1 回答 1

0

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

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

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

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

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;
于 2014-01-29T03:35:15.307 回答