2016-04-21 83 views
0

我正在處理的代碼將更改以數字1或0存儲爲1/0或Y/N的數百個變量的編碼。因爲這需要處於靈活的過程中,我正在寫一個宏來這樣做。我對宏的唯一問題是我無法將SAS列名傳遞給宏來工作。思考?SAS:傳遞數組名稱

%Macro Test(S,E); 
%Array(A,&S.-&E.); 
%MEnd; 

data subset; 
    set dataset); 
    %Test(v1,v20) 
run; 
+0

我推薦使用proc sql;選擇語句,從它建立你的datastep數組語句。這種方法會很慢。但你應該發佈到Stack Exchange論壇,而不是在這裏,因爲你的問題不包含任何統計問題。 – StatsStudent

回答

0

所有變量名稱的列表存儲在dictionary.columns數據集中。您可以訪問它並將名稱存儲爲可以循環訪問的列表:

proc sql noprint; 
    select name into: list_of_names 
    separated by " " 
    from dictionary.columns where memname = upcase("your_dataset"); 
quit; 
%put &list_of_names.; 
1

SAS支持變量列表。宏參數只是文本字符串。因此,只要您在SAS支持變量列表的地方使用宏變量值,將變量列表傳遞給宏就沒有問題。例如這裏有一個簡單的宏來作出數組聲明。

%macro array(name,varlist); 
    array &name &varlist ; 
%mend; 

然後你可以在這樣的數據步驟中使用它。

data want; 
    set have ; 
    %array(binary,var1-var20 a--d male education); 
    do over binary; binary=binary in ('Y','1','T'); end; 
run; 

困難的部分是,如果你想從變量字符數字轉換,那麼你就需要重新命名。這將使它很難使用變量列表(x1-x5或vara-vard)。你可以用一些額外的邏輯來解決這個問題,將變量列表轉換成單個名字列表。例如,您可以使用PROC TRANSPOSE創建一個數據集,其中包含與您的列表匹配的變量名稱。

proc transpose data=&inds(obs=0) out=_names ; 
    var &varlist; 
run; 

然後,您可以使用此數據集來生成代碼或生成單個變量名稱的列表。

proc sql noprint ; 
    select name into :varlist2 separated by ' ' from _names; 
quit;