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