我有很多以“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 中我不太确定如何。
问问题
4688 次
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 回答