如何在过程块中使用 SAS 多个宏变量(仅当存在时才使用循环)

问题描述 投票:0回答:1

我使用数据值的调用符号创建了多个宏变量,我想在宏中使用循环在过程块中使用它们,但它不适合我。

  • 创建宏变量;
Data _null_;
  set all;
  n= _n_;
  n1 = strip(put(n, best.));
  call symput('seq'||n1, n1);
  *creates macro variables like sort1, sort2, sort3,....;
  if ~missing(var) then call symput('sort'||left(_n_), var);
run;

  • 未找到任何记录;
Proc sql noprint;
  select count(var) into:Noobs from all;
quit;

%put &Noobs

  • 宏块;

%macro sortuntil(n= );
  %do i = 1 %to n;
     %let data = i;
     %do %until (&data eq &seq(i));
        Proc sort data = dif;
           by &sort1 &sort2 &sort3 &sort4 . . . etc;
        run;
      %end;
   %end;
%mend;

%sortuntil(n=&Noobs);

上面的代码应该根据 data null 块中创建的宏变量的数量对数据进行排序 示例:所有数据集在 var 变量中都有 15 条记录,因此在本例中执行以下代码

Proc sort data = dif;
             by &sort1 &sort1 &sort1 &sort1 &sort1 . . . sort15;
         run;
loops sorting sas procedure sas-macro
1个回答
0
投票

有更简单的方法可以做到这一点。例如,您可以将 PROC SQL 与 SELECT INTO 一起使用来创建将保存变量名称列表的单个宏变量。但如果您对宏循环感兴趣,也可以使用该方法。请注意,您的代码有循环错误。您正在循环内运行 PROC SORT,因此如果您调用 %SortUntil(n=15) 它将运行 PROC SORT 15 次。相反,您可能希望使用循环在 BY 语句上构建变量列表。你可以这样做:

data dif ;
x=1 ; y=2 ; z=3 ;
run ;

%let sort1=x ;
%let sort2=y ;
%let sort3=z ;

%macro sortuntil(n= );
  %local i ;
  proc sort data = dif;
    by
      %do i = 1 %to &n;
        &&sort&i
      %end ;
    ;
  run ;
%mend;

options mprint ;
%sortuntil(n=3)
%sortuntil(n=1)
© www.soinside.com 2019 - 2024. All rights reserved.