【问题标题】:Creating data output using a macro do loop in SAS在 SAS 中使用宏 do 循环创建数据输出
【发布时间】:2015-08-06 22:03:34
【问题描述】:

当我在 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 循环,并且似乎无法执行与常规数据步骤相同的操作(即无法让我的结果显示在输出窗口中)。我的宏的目标是将“_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;

【问题讨论】:

  • 我认为没有一种方法可以轻松做到这一点。您可以创建一个数据步骤并进行打印。我想知道您总体上要做什么。
  • 是的,这是一个非常奇怪的要求。为什么不直接填充表格,然后使用您喜欢的方法打印到输出屏幕?

标签: loops macros sas


【解决方案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

【讨论】:

    【解决方案2】:

    有全局宏符号表和局部宏符号表,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
    

    【讨论】:

    • 感谢您的帮助。虽然,我真的在寻找如何生成输出的帮助(在输出窗口中,而不是在日志中),这将为我提供变量 A_new、B_new、C_new、D_new 的列表。只是把%put &my_new_varlist; 不是我真正想要的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2014-11-11
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多