2

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

4

5 回答 5

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
于 2012-07-02T11:21:18.027 回答
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
于 2012-07-02T08:47:45.100 回答
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.;
于 2012-07-02T09:31:53.440 回答
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 步。

于 2012-07-02T10:00:39.153 回答
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()
于 2012-07-06T21:57:01.037 回答