我想在SAS中创建一些像Excel查找功能一样的东西.基本上,我设定的值,宏变量var1,var2...我想根据找到自己的索引号ref表.但是我在数据步骤中收到以下消息.
NOTE: Variable A is uninitialized.
NOTE: Variable B is uninitialized.
NOTE: Variable NULL is uninitialized.
Run Code Online (Sandbox Code Playgroud)
当我打印变量&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;
Run Code Online (Sandbox Code Playgroud)
我能得到正确的值&num1,&num2..如果我输入varname='A'的if-then语句.如果我随后将声明更改回来varname=&var1,我仍然可以获得所需的输出.但为什么会这样呢?我不想输入实际的字符串值,然后将其更改回宏变量以获取每次结果.
解决即时问题
如果希望SAS将它们视为字符串常量,则需要将宏变量用双引号括起来.否则,它将以与在数据步骤中找到的任何其他随机文本位相同的方式处理它们.
或者,您可以重新定义宏变量以包含引号.
作为进一步的选择,您可以使用symget或resolve函数,但除非您想要创建宏变量并在同一数据步骤中再次使用它,否则通常不需要这些.如果你用它们作为双引号的替代品,它们往往会使用更多的CPU,因为默认情况下它们会每行评估一次宏变量 - 通常,在代码执行之前,宏变量只在编译时评估一次.
更好的方法?
对于您正在进行的查找,您实际上根本不需要使用数据集 - 您可以改为定义自定义格式,这使您可以更灵活地使用它.例如,这会创建一个名为lookup:
proc format;
value lookup
1 = 'A'
2 = 'B'
3 = 'C'
other = '#N/A' /*Since this is what vlookup would do :) */
;
run;
Run Code Online (Sandbox Code Playgroud)
然后你可以使用这样的格式:
%let testvar = 1;
%let testvar_lookup = %sysfunc(putn(&testvar, lookup.));
Run Code Online (Sandbox Code Playgroud)
或者在数据步骤中:
data _null_;
var1 = 1;
format var1 lookup.;
put var1=;
run;
Run Code Online (Sandbox Code Playgroud)