2

「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 では方法がよくわかりません。

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

通常の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 に答える