我试图将参数表用作sas格式。我尝试了很多方法,但其中任何一个都有效。我的想法是。
使用proc格式。我不确定是否可以使用数据集中的两个特定列来构建SAS格式。
构建一个类似于格式的SAS宏。
%macro test(var1=);
%GLOBAL &var_aux;
proc sql noprint;
Select trasformated_value into :&var_aux
from parametric_table
where original_value=&var1.;
var1=&var_aux;
quit;
drop &var_aux;
%mend;
宏的问题在于我不知道如何将值返回到原始查询。
data transformation;
set transformation;
New_value = %test(old_value);
run;
答案 0 :(得分:1)
如果你要做你上面做的事情,你需要编写一个函数式宏,这不是很容易做到的(可能,但不容易做到这一点)。
宏本质上不是函数,它们只是您在别处编写并重复的代码。所以你不能真正在等号的右边调用一个宏,除非它包含的唯一非宏代码是等号右边的代码有效。
在这种情况下,我同意format
作为解决方案。您需要使用cntlin
中的proc format
选项,并且需要在运行数据步骤之前创建格式。
您至少需要fmtname
,start
,label
。 type
通常也包括在内。 hlo="o"
行也是一个好主意(对于“其他”)。
data for_fmt;
set parametric_table;
retain fmtname 'PARAMETF' type 'N'; *or 'C' and include a $ if character;
rename
original_Value = start
transformed_value = label
;
output;
if _n_=1 then do;
hlo='o';
call missing(original_value);
transformed_value = .; *or ' ' or whatever you want a non-match to return;
output;
end;
run;
proc format cntlin=for_fmt;
quit;
确保您没有重复的start
值,否则这是您所描述内容的最佳方法。那你有
data transformation;
set transformation;
new_value = input(put(old_value,PARAMETF.),BEST12.); *or whatever depending on what you are doing. Format makes CHAR value always, so `input` to convert to number.;
run;
这里不需要宏,虽然你当然可以(而且,我会说,应该)有一个通用宏来创建这样的格式。