如何在SAS中调用带有字符串前缀的数字宏变量



我在SAS中获得一个错误,而在一个数据集中创建一个新的字段,调用一个数字宏变量。这里有一个例子。

data input;
input cutoff_1 cutoff_2;
datalines;
30 50
;
data db;
input outstanding;
datalines;
1000.34
2000.45
3000.90
5000.98
8000.02
;

data _null_;
set input;
call symput("perc1",cutoff_1);
call symput("perc2",cutoff_2);
run;

proc univariate data=db noprint;
var outstanding;

output out=test
pctlpts = &perc1. &perc2.
pctlpre = P_;
run;
data test2;
set test;
p_&perc1._round=round(P_&perc1.,1);
p_&perc2._round=round(P_&perc2.,1);
run;

从日志看来,宏&perc.解决了,但它是不可能使用这些结果(30,50)命名一个新的变量在数据集test2。我错过了什么?

当您要求正常的SAS代码在需要字符值的地方使用数值(CALL SYMPUT()的两个参数都需要字符值)时,SAS将使用BEST12将数字转换为字符串。如果值不需要全部12个字符,它将被右对齐。因此,您创建了带有前导空格的宏变量。前导空格对生成pctlpts=选项值没有影响,因为多余的空格在这里无关紧要。但是使用前导空格意味着生成如下代码:

p_         30_round=round(P_          30,1);

你应该使用现代的(可能超过20年的)CALL SYMPUTX()函数。该函数将在创建宏变量时从第二个参数中删除前导/尾随空格。它还接受一个数值作为第二个参数,使用更类似于BEST32而不是BEST12的格式将数字转换为字符串。

call symputx("perc1",cutoff_1);
call symputx("perc2",cutoff_2);

您应该使用古老的CALL SYMPUT()函数的唯一情况是当您实际需要创建包含前导和/或尾随空格的宏变量时。

其他解决方案是删除函数调用

中的空格
call symput("perc1",strip(put(cutoff_1,best32.)));

或在生成宏变量之后。

%let perc1=&perc1;

一个可能的解决方案是使用call symputx而不是call symput。对于call symputx,创建的变量是全局定义的。

最新更新