当我在SAS中使用宏do循环时,我正在努力创建输出。在常规数据步骤中,我可以通过执行以下操作创建以下数据集,其中变量i
和var
将在输出窗口中“打印”:
data example;
do i=1 to 4;
var = 2+i;
output;
run;
将在输出窗口中创建
Obs i var
1 1 3
2 2 4
3 3 5
4 4 6
现在,我的问题是我正在使用宏do循环,并且似乎不能像常规数据步骤那样(即无法在输出窗口中显示我的结果)。我的宏的目标是从列表中的每个变量名称(A B C D)的末尾添加“_new”,然后我需要在输出窗口中显示它。
%let myvarlist=A B C D;
%macro create_new;
%let mlength=%countlength(&myvarlist);
%let suffix=new;
%do n=1 %to &mlength;
%let var_n=%qscan(&myvarlist,&n);
%let my_new_varlist=&var_n._&suffix;
%end;
%mend;
%create_new
我能得到的最接近的事情是将%put &my_new_varlist;
放在%end
语句之前,但是这会把它放在日志窗口中。我尝试在数据步骤中插入我的do循环,然后使用proc打印,但这不起作用。
宏%countlength
是我用来计算列表中变量数量的宏。它的代码是:
%macro countlength(char);
%local num inputword;
%let num=1;
%let inputword=%qscan(&char,&num,%str( ));
%do %while(&inputword NE);
%let num=%eval(&num+1);
%let inputword=%qscan(&char,&num,%str( ));
%end;
%eval(&num-1);
%mend;
答案 0 :(得分:1)
我不认为单独使用宏语言可以写入输出窗口,因为这不是它的工作。它(主要)的工作是生成SAS代码。但是,SAS代码可以写入输出窗口。也许:
data _null_ ;
file print ;
put "&my_new_varlist" ;
run ;
建议您查看Richard Devenzia的实用程序宏%seplist。这是向列表添加前缀/后缀/分隔符的一种非常好的方法。 http://www.devenezia.com/downloads/sas/macros/index.php?m=seplist
答案 1 :(得分:0)
有全局宏符号表和本地宏符号表,在countlength宏程序中产生的& num宏变量是本地宏变量,在countlength结束运行后它将从本地表中删除,所以& num不能用于调用宏程序(create_new)。您的代码可以修改为:
%macro countlength(char);
%let num=1;
%let inputword=%qscan(&char,&num,%str( ));
%do %while(&inputword NE);
%let num=%eval(&num+1);
%let inputword=%qscan(&char,&num,%str( ));
%end;
%global mlength;
%let mlength=%eval(&num-1);
%mend;
%let myvarlist=A B C D;
%macro create_new;
%countlength(&myvarlist)
%let suffix=new;
%do n=1 %to &mlength;
%let var_n=%qscan(&myvarlist,&n);
%let my_new_varlist=&var_n._&suffix;
%put &my_new_varlist;
%end;
%mend;
%create_new
另外,countw是SAS函数来计算字数。你可以直接使用。
%macro create_new;
%let mlength=%sysfunc(countw(&myvarlist));
%let suffix=new;
%do n=1 %to &mlength;
%let var_n=%qscan(&myvarlist,&n);
%let my_new_varlist=&var_n._&suffix;
%put &my_new_varlist;
%end;
%mend;
%create_new
编辑:如果我理解你的问题,也许这就是代码。
%let myvarlist=A B C D;
%macro create_new;
%local mlength sufix n;
%let mlength=%sysfunc(countw(&myvarlist));
%let suffix=new;
data want;
%do n=1 %to &mlength;
%let var_n=%qscan(&myvarlist,&n);
my_new_varlist="&var_n._&suffix";
output;
%end;
run;
%mend;
%create_new