使用SAS

时间:2015-08-06 22:03:34

标签: loops macros sas

当我在SAS中使用宏do循环时,我正在努力创建输出。在常规数据步骤中,我可以通过执行以下操作创建以下数据集,其中变量ivar将在输出窗口中“打印”:

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;

2 个答案:

答案 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