簡體   English   中英

SAS將宏功能的結果分配給數據步驟中的數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM