2014-01-29 78 views
0

我想獲得brand_channel宏的結果。 宏在%do-loop語句中不工作在i = 2,3,4。 如何迭代執行do_scoring宏?如何在另一個宏中反覆執行sas宏?

謝謝!

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

我假設您正在嘗試創建'%doing_scoring()'宏?如果是這樣,你需要將它定義爲'%macro doing_scoring(); ...%修正;'而不是'%doing_scoring; ...%修補「。 – DomPazz

回答

0

你的代碼很好,除了第一行(do_scoring的聲明),但這可能是我想的轉錄錯誤。 下面我有一個功能測試版本。

但是,我有更好的方法來做同樣的事情。從根本上講,宏觀驅動迭代是一個壞主意,幾乎所有您可能想要嘗試的任務都有更好的方法。

在這種情況下,您可以直接從seq_ dataset調用do_scoring調用,並將子數據集的創建移動到宏(應該很容易),或者更好的方法是將數據集保存爲一個整體。

首先是更好的方法:調用execute。 (或者,您可以創建使用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;