3

Stata では、 foreach コマンドを使用して文字値のリストをループできます。私はこれまで、SASで同じことをしようとしてきましたが、役に立ちませんでした。文字列のすべての値に対して一連の data および proc ステートメントを実行しようとしています。私は次のことを試しました:

%let mylist = a b c; * These are all the values of a column called "code";

data mydata_@mylist; * Each element creates a new table;       
   set mydata;   
   where code=&mylist; 
   run;

私は何が間違っているか、欠けていますか?

前もって感謝します、

マティアス

4

3 に答える 3

6

これを試して:

%macro loopit(mylist);
   %let n = %sysfunc(countw(&mylist));
   %do I=1 %to &n;
      %let val = %scan(&mylist,&I);

      data mydata_&val;
         set mydata;
         where code = "&val";
      run;
   %end;
%mend;

%let list=a b c;
%loopit(&list);
于 2013-09-03T15:56:55.560 に答える
0
%macro getName;
%let name = %sysfunc(translate(&val, __, -/));
%mend;

%macro loopit(mylist);
    %let else=;
     %let name=;
   %let n = %sysfunc(countw(&mylist, %str( )));
    data 
   %do I=1 %to &n;
      %let val = %scan(&mylist,&I, %str( ));
        %getName
      mydata_&name
    %end;
        other
        ;


         set mydata;
   %do j=1 %to &n;
      %let val = %scan(&mylist,&j, %str( ));
        %getName
        %if &j ne 1 %then %do;
        %let else=else;
        %end;
      &else if code = "&val" then output mydata_&name;
        %if &j = &n %then %do;
        else output other;
        %end;
   %end;
   run;
%mend;

options mprint;
%let list=a-a b/b c-;
%loopit(&list);

このバージョンでは、単語区切りとしてスペース ( ) のみを使用する修飾子を使用COUNTWして関数を使用します。SCAN%str( )

また、新しいマクロgetNameを使用して、SAS 命名規則に従ってデータセットの名前を作成します (入力するために%let name = ;内部に変数を提供するだけであることに注意してください)。%loopit%getName

%getName許可されていない文字をアンダースコアに変換します (異なるセパレーターを持つ同じ値がある場合、ここで名前の競合が発生する可能性があります)。

于 2013-09-10T15:27:36.243 に答える