2012-02-09 69 views
0

该代码获取两个宏并将它们分配给数据步骤中的数组,然后遍历ln_vars中定义的每个变量,创建一个新变量,该变量是变量的自然对数,追加_ln的名字SAS将宏函数的结果分配给数据步骤中的数组

%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()函数。 注释的“调用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)'. 
+0

在尝试自动化,写在分析中成功执行一个观察的代码。发布该代码(和示例数据),它会更容易帮助。上面的代码可以使用 – 2012-02-09 18:47:51

+0

。我想用它的下面注释掉的一些版本的call execute命令替换数据步骤中的&ln_names。 – 2012-02-09 21:12:46

回答

2

,如果你给我们的%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; 

注意两个%看跌语句都是不必要的 - 他们只是摆在那里检查两个宏观变量


按您的评论的价值,你可以有一个宏:

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

(注意,我没有测试的代码,但你应该得到的总体思路)

+0

我试图避免将两个宏变量传入数据步骤。 – 2012-02-09 21:07:46

+0

查看替代方案。您仍在引用我们看不到的宏,即%add_string。 – DavB 2012-02-09 22:15:50