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

How to recall a numeric macro variable with a string prefix in 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. 已解决,但无法使用这些结果(3050)在数据集 test2。我错过了什么?

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

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

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

您应该改用现代 (probably over 20 years old) CALL SYMPUTX() 函数。该函数将在创建宏变量时从第二个参数中删除 leading/trailing 个空格。它还接受一个数值作为第二个参数,使用更像 BEST32 而不是 BEST12 的格式将数字转换为字符串。

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

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

其他解决方案是删除函数调用中的空格

call symput("perc1",strip(put(cutoff_1,best32.)));

或生成宏变量后。

%let perc1=&perc1;