我们说我创建了一个宏变量。
%let par = var1 var2 var3;
现在我想在像这样的程序中使用这些值
proc score data=test type=parms score=par out=score;
var W_var1 W_var2 W_var3;
run;
例如,如果var1 = age,那么我想在var语句中列出W_age。我试过var W_∥
,但它没有用。有人能帮我解决一个简单的解决方案吗?非常感谢!!
答案 0 :(得分:2)
您必须创建一个宏来解决此问题。
宏从宏变量中获取每个参数,并为其添加一些前缀。
%macro list_with_prefix(string, prefix);
%local i;
%let i = 1;
%do %until(%scan(&string., &i., %str( )) = );
&prefix.%scan(&string., &i., %str( ))
%let i = %eval(&i. + 1);
%end;
%mend;
%let par = var1 var2 var3;
proc score data=test type=parms score=par out=score;
var %list_with_prefix(&par, W_);
run;
答案 1 :(得分:0)
使用常规快递:
%let par = var1 var2 var3;
%let new_par=%sysfunc(prxchange(s/(\w+)/W_$1/,-1,&par));
%put &new_par;
答案 2 :(得分:0)
这可以使用TRANWRD()
函数来解决。
%let par = var1 var2 var3;
%let new_par=W_%sysfunc(tranwrd(&par,%str( ),%str( W_)));
%put &new_par;
但是你需要确保你的参数在单词之间没有多个空格。所以要先运行它,要么将它嵌入上面的语句中。
%let par=%sysfunc(compbl(&par));