Loops 在SAS中使用宏do循环创建数据输出
当我在SAS中使用宏do循环时,我正在努力创建输出。在常规数据步骤中,我可以使用变量Loops 在SAS中使用宏do循环创建数据输出,loops,macros,sas,Loops,Macros,Sas,当我在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循环,
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循环,似乎无法执行与常规数据步骤相同的操作(即无法在输出窗口中显示结果)。我的宏的目标是将“_new”添加到列表中每个变量名(A B C D)的末尾,然后我需要它显示在输出窗口中
%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;
有全局宏符号表和本地宏符号表,countlength宏程序中生成的&num宏变量是本地宏变量,在countlength完成运行后,它将从本地表中删除,因此&num不能用于调用宏程序(新建)。您的代码可以修改为:
%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
我不认为宏语言可以单独用于写入输出窗口,因为这不是它的工作。它的工作(主要)是生成SAS代码。但是,SAS代码可以写入输出窗口。也许:
data _null_ ;
file print ;
put "&my_new_varlist" ;
run ;
建议您查看Richard Devenzia的实用程序宏%seplist。这是一种很好的向列表添加前缀/后缀/分隔符的方法 我感谢你的帮助。尽管如此,我还是在寻找有关如何生成输出(在输出窗口中,而不是在日志中)的帮助,该输出将为我提供变量a_new、B_new、C_new、D_new的列表。只需将
%put&my\u new\u varlist代码>并不是我真正想要的:)我认为没有一种方法可以轻松做到这一点。您可以创建一个数据步骤并进行打印。我想知道你到底想做什么。是的,这是一个非常奇怪的要求。为什么不只是填充一个表,然后使用您最喜欢的方法打印到输出屏幕上呢?