「s」で始まり、その後にs1 s7 s13 s32などの数字が続くsasデータセットファイルがたくさんあります(たくさんあります)。ファイルごとに一連のコードを実行し、最後の結果を保存してから、次のデータセット ファイルで再開します。通常、データセット ファイル番号が s1 s2 s3 s4 s5 のように連続している場合、たとえば a %do i=1 %to 120
. しかし、インクリメントが等しくないループを実行したい場合はどうすればよいでしょうか? これどうやってするの?たとえば a のように%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
通常のdoループでは非順次インクリメントを実行できますが、マクロのdoループでは同じ方法で実行できません。SAShelpWebサイトに回避策があります。
http://support.sas.com/kb/26/155.html
最初に、次のコードを使用して、数字をコンマ区切りのマクロリストに入れます。prxmatch関数は、「S」で始まり、その後に数字が続くデータセット名を検索します。これを入手したら、SASWebサイトのコードに従うことができます。
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
これは、上記の 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 に答える
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
以下の例では、データ セット 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 に答える