如何在sas宏

时间:2016-11-21 14:40:22

标签: sas sas-macro

我试图将参数表用作sas格式。我尝试了很多方法,但其中任何一个都有效。我的想法是。

  1. 使用proc格式。我不确定是否可以使用数据集中的两个特定列来构建SAS格式。

  2. 构建一个类似于格式的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;
    
  3. 宏的问题在于我不知道如何将值返回到原始查询。

    data transformation;
    set transformation;
    New_value = %test(old_value);
    run;
    

1 个答案:

答案 0 :(得分:1)

如果你要做你上面做的事情,你需要编写一个函数式宏,这不是很容易做到的(可能,但不容易做到这一点)。

宏本质上不是函数,它们只是您在别处编写并重复的代码。所以你不能真正在等号的右边调用一个宏,除非它包含的唯一非宏代码是等号右边的代码有效。

在这种情况下,我同意format作为解决方案。您需要使用cntlin中的proc format选项,并且需要在运行数据步骤之前创建格式。

您至少需要fmtnamestartlabeltype通常也包括在内。 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;

这里不需要宏,虽然你当然可以(而且,我会说,应该)有一个通用宏来创建这样的格式。