如何在 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.
已解决,但无法使用这些结果(30
、50
)在数据集 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;
我在调用数字宏变量的数据集中创建新字段时在 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
。我错过了什么?
一种可能的解决方案是使用 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;