[英]SAS assign results from macro function to array within data step
此代碼接受兩個宏並將它們分配給數據步驟中的數組,然后循環遍歷ln_vars中定義的每個變量,創建一個新變量,該變量是變量的自然日志,將_ln附加到名稱
%let ln_vars = var1 var2;
%let ln_names = %add_string(&ln_vars, _ln);
data transform;
set analysis;
array ln &ln_vars;
array ln_n &ln_names;
*call execute ('%add_string(%str(&ln_vars), _ln)');
do over ln;
ln_n = log(ln);
end;
run;
也許在sas代碼中有一個更好的習慣用語(我希望)。 我希望能夠只傳遞一個宏(ln_vars宏)並從數據步驟中調用%add_string()函數。 注釋'call execute'返回正確的字符串,但是當我嘗試時
1588 array ln_n call execute ('%add_string(%str(&ln_vars), _ln)');
ERROR: Attempt to initialize variable call in numeric array ln_n with character constant
'%add_string(%str(&ln_vars), _ln)'.
如果你給我們%add_string宏的定義會有所幫助。 在任何情況下,看起來你需要&ln_names作為匹配&ln_vars中列表的變量列表,除了每個變量都有后綴'_ln'。
如果我是正確的,你真的不需要%add_string宏,而是可以這樣做:
%let ln_vars = var1 var2;
%let ln_names = %sysfunc(tranwrd(&ln_vars,%str( ),%str(_ln )))_ln;
%put LN_VARS: &ln_vars;
%put LN_NAMES:&ln_names;
data transform;
set analysis;
array ln &ln_vars;
array ln_n &ln_names;
do over ln;
ln_n = log(ln);
end;
run;
請注意,兩個%put語句實際上並不是必需的 - 它們只是放在那里檢查兩個宏變量的值
根據你的評論,你可以有一個宏:
%macro lnvars(vars=,suffix=_ln);
%let newvars=%sysfunc(tranwrd(&vars,%str( ),%str(&suffix )))&suffix;
array ln &vars.;
array ln_n &newvars.;
do over ln;
ln_n = log(ln);
end;
%mend;
然后從數據步驟中調用宏,如下所示:
data transform;
set analysis;
%lnvars(vars=var1 var2);
run;
(注意,我沒有測試過代碼,但你應該得到一般的想法)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.