在sas

时间:2015-05-07 06:55:51

标签: sas sas-macro

我想在SAS中创建一个像Excel查找功能一样的东西。基本上,我设置宏变量var1var2,...的值,我想根据ref表找到它们的索引号。但是我在数据步骤中收到以下消息。

NOTE: Variable A is uninitialized.
NOTE: Variable B is uninitialized.
NOTE: Variable NULL is uninitialized.

当我打印变量&num1&num2时,我什么都没得到。这是我的代码。

data ref;
    input index varname $;
    datalines;
0 NULL
1 A
2 B
3 C
;
run;

%let var1=A;
%let var2=B;
%let var3=NULL;

data temp;
    set ref;
    if varname=&var1 then call symput('num1',trim(left(index)));
    if varname=&var2 then call symput('num2',trim(left(index)));
    if varname=&var3 then call symput('num3',trim(left(index)));
run;

%put &num1;
%put &num2;
%put &num3;

如果我在&num1语句中输入&num2,我可以获得varname='A'if-then的正确值。如果我随后将语句更改回varname=&var1,我仍然可以获得所需的输出。但为什么会这样呢?我不想输入实际的字符串值,然后将其更改回宏变量以便每次都获得结果。

1 个答案:

答案 0 :(得分:8)

立即解决问题

如果希望SAS将它们视为字符串常量,则需要将宏变量用双引号括起来。否则,它将以与在数据步骤中找到的任何其他随机文本位相同的方式处理它们。

或者,您可以重新定义宏变量以包含引号。

作为进一步的选项,您可以使用symgetresolve函数,但除非您想要创建宏变量并在同一数据步骤中再次使用它,否则通常不需要这些函数。如果你用它们作为双引号的替代品,它们往往会使用更多的CPU,因为默认情况下它们会每行评估一次宏变量 - 通常,在代码执行之前,宏变量只在编译时评估一次。 / p>

更好的方法?

对于您正在进行的查询,实际上您根本不需要使用数据集 - 您可以改为定义自定义格式,这样您就可以更灵活地使用它。例如。这会创建一个名为lookup的格式:

proc format;
  value lookup
  1 = 'A'
  2 = 'B'
  3 = 'C'
  other = '#N/A' /*Since this is what vlookup would do :) */
  ;
run; 

然后你可以使用这样的格式:

%let testvar = 1;
%let testvar_lookup = %sysfunc(putn(&testvar, lookup.));

或者在数据步骤中:

data _null_;
  var1 = 1;
  format var1 lookup.;
  put var1=;
run;