用不等的增量循环

时间:2012-07-02 06:57:47

标签: loops sas increment do-loops

我有很多sas数据集文件,以“s”开头,后跟一些数字,如s1 s7 s13 s32等(我有很多)。 对于每个文件,我运行一组代码,保存我的上一个结果,然后使用以下数据集文件重新启动。通常,当我的数据集文件编号是顺序时,如s1 s2 s3 s4 s5 ...它很容易使用,例如%do i=1 %to 120。但是如果我想以不相等的增量进行循环呢?我怎样才能做到这一点?例如%do i=1 7 13 32...。这在MATLAB中非常简单,但在SAS中我不太清楚如何。

5 个答案:

答案 0 :(得分:3)

使您的%do从最低数据集编号到最高。然后检查数据集是否存在。

%Let lib=yourlib;
%Macro Process;

 %Do i = 1 %to 1000;
  %if %sysfunc(exist(&lib..s&i)) %then %do;

    <your code>

  %end;

 %end;

%Mend process;
%process

答案 1 :(得分:1)

以下示例获取数据集S1,S3和S10并处理它们,输出数据集NEW1,NEW3和NEW10:

/* Example data sets */
data s1 s3 s10;
run;

%macro mymac;

  /* Create 'array' of macro variables DSET1, DSET2...up to a max of DSET9999.
     Each DSETx macro variable will contain a data set number. */
  proc sql noprint;
    select compress(memname,"sS") into :dset1-:dset9999
    from sashelp.vtable
    where libname="WORK" and upcase(substr(memname,1,1))="S"
          and input(compress(memname,"sS"),8.) ne .;
  quit;
  %let numdsets=&sqlobs;

  /* Process data sets */    
  %do i=1 %to &numdsets.;
    data new&&dset&i.;
      set s&&dset&i.;
    run;
  %end;
%mend mymac;
%mymac

答案 2 :(得分:1)

您可以在正常的do循环中执行非顺序增量,但不能在宏do循环中以相同的方式执行。 SAShelp网站上有一个解决方法。

http://support.sas.com/kb/26/155.html

我首先使用以下代码将数字放在逗号分隔的宏列表中。 prxmatch函数搜索以“S”开头的数据集名称,后跟一个数字。完成后,您可以按照SAS网站上的代码进行操作。

proc sql noprint;
select compress(upper(memname),'S') into :ds_num separated by ',' from dictionary.tables
where libname='WORK' and prxmatch("/S\d+/",upper(memname));
quit;

%put &ds_num.;

答案 3 :(得分:1)

%SCAN是你的朋友。请看下面的示例代码 -

%let nums = 1 2 4 6 13 29 32;

%macro iter();

%let cnt = %sysfunc(countc(&nums," "));
%let cnt = %eval(&cnt + 1);
%put &cnt;

%do i = 1 %to &cnt;
%put I will now process dataset s%scan(&nums,&i," ");
%end;

%mend iter;

%iter()

您可以修改部分%put ...以编写DATA步骤。

答案 4 :(得分:1)

这是Mozan上面回答的更新。我不建议使用CountC来计算列表中的元素。    请改用CountW。请注意以下更新:

%let nums = 1 2 4 6 13 29 32;

%macro iter();

%let cnt = %sysfunc(CountW(&nums));
%put &cnt;

%do i = 1 %to &cnt;
  %put I will now process dataset s%scan(&nums,&i);
%end;

%mend iter;

%iter()