2017-05-18 85 views
0

我問一個老問題。我有代碼,看過以前的問題,但我無法糾正我的錯誤。以下是帶有虛擬數據的代碼。我無法將變量的名稱傳遞給宏。將變量列表讀入sas宏

data x;                                 
inputs x$ y z;                               
datalines;                                
a 23 34                                 
b 34 43                                 
a 23 54                                 
b 87 78                                 
a 12 32                                 
b 22 33                                 
;                                  
run; 

現在我創建的變量

%let name_list=y z; 

然後我寫的宏列表。

%macro mixed;                               
    %let j=1;                                
    %let first=%scan(&name_list.,%eval(&j));                        
    %do %while (&first ne);                   

     proc mixed data=x;                           
      class x;                            
      model &name_list.=;                          
      random x;                            
    ods output covParms=cov1;                          
    run;                             
    %let j=%eval(&j+1);                            
     %let first=%scan(&name_list.,%eval(&j));                       
    %end;                                 
    run;                                 
%mend;                                 

%mixed; 

一些如何不工作。任何幫助將不勝感激。

+0

您的宏代碼工作(雖然可以改進)。 「不工作」是什麼意思? PROC MIXED正在嘗試生成的MODEL語句是什麼?現在你正在生成'model y z =;'這可能是問題所在。 – Quentin

+0

在宏調用之前添加'options mprint mlogic symbolgen;'至少可以幫助診斷。 – Hugs

回答

0

如果你想迭代列表中的名字,那麼你可以使用正常的%DO ... %TO循環。無需手動初始化或增加計數器。

%do i=1 %to %sysfunc(countw(&name_list)); 
    %let name=%scan(&name_list,&i); 
.... place code here that uses &NAME .... 
%end; 
+0

同意,COUNTW的創建(在v9早期?)使項目列表更容易循環。我通常指定countw的分隔符,即'%do i = 1%到%sysfunc(countw(&name_list,%str()));'這樣如果列表爲null,它將返回0而不是錯誤。 – Quentin

+0

非常感謝。它現在有效。現在我想將結果追加到一個數據集中。儘管如此,我還是有一個想法,並將繼續努力。感謝讚賞。 – Nupi

+0

使用PROC APPEND將結果集聚合在一起。 – Tom