SAS学習ノート(九)—SASマクロ

15222 ワード

文書ディレクトリ
  • マクロ変数
  • マクロ関数
  • symputxルーチンとsymget関数
  • SQLプロシージャステップマクロ変数作成
  • マクロプログラム
  • マクロ変数
    重複する変数とコードを置き換えることができます
  • 定義:%let indvars = ;
  • 引用(解析):&(テキスト列への置換)
  • 間接参照:& && &&&マクロプロセッサの複数の「&」に対する処理ルールは、左から右にスキャンし、マクロ変数の前に「&」が1つしか含まれていなければ、そのマクロ変数を解析する.そうでなければ隣接する2つの「&」を1つの「&」に置き換え、解析が完了するまで上記のスキャンを繰り返す
  • 出力:%put text;(後のデフォルトは文字列で引用符は不要;put文と異なる)
  • すべてのシステムに付属/ユーザカスタム/すべてのマクロ変数を出力:%put _automatic_/_user_/_all_→e.g.title ="today's date is &SYSDATE9 and today is &SYSDAY";マクロ変数がタイトル文に埋め込まれている場合、二重引用符のみでは一重引用符は使用できない
  • 区切り記号. ( )マクロ変数が参照されている場合、SASは接続後のテキストを認識できず、区切り記号を使用して区切り記号の前のマクロ変数部分を通知する必要がある.使用句点マクロ変数区切り記号として使用します.→ e.g. %LET libref=sashelp; proc print data=&libref..class; run;
  • グローバルマクロ変数(マクロプログラム以外で定義)VS.ローカルマクロ変数
  • 削除:%symdel 1 2;
  • マクロ関数
    マクロ文字列処理関数のパラメータは、固定テキスト、マクロ変数参照、マクロ関数、マクロ呼び出しなどの任意のテキストおよび(または)マクロトリガであってもよい.固定テキストパラメータには引用符は必要ありません
  • 共通関数
  • マクロ関数
    使用方法
    機能
    %upcase
    %upcase(string)
    小文字を大文字に変換
    %substr
    %substr(string, n1, n2)
    文字列からのサブストリングの抽出
    %scan
    %scan(string, n)
    文字列から単語を抽出
    %index
    %index(string)
    文字列内の指定テキストの検索
    %eval
    算術演算と論理演算を行う
    %sysfunc
    %str(argument)
    SAS関数の実行
    %str
    特殊文字の参照(マスク(通常の意味を削除)特殊記号:+-*/,<>=;"LT EQ GT LE GE NE AND OR NOT blank)
    %nrstr
    %nrstr(title “S&P 500”; )
    SASトリガを含む特殊文字の参照
    Symputxルーチンとsymget関数
    異なるプロシージャ・ステップでのデータの転送を実現
  • Symputxルーチン——マクロ変数にデータステップの情報を渡すCALL SYMPUTX(“new_macro-variable”, value_in_string)
  • パラメータ1は、作成中のマクロ変数がデータステップで伝達している情報を格納している
  • パラメータ2は文字列形式の値
  • 新しいマクロ変数はテキスト型で、一致引用符で囲む
  • Symget関数——マクロ変数の情報をデータステップに伝えるsymget(“macro-variable”)
  • パラメータは、マクロ変数の名前、文字列変数または文字式であってもよい.

  • 動的付与マクロ変数
  • proc means data = hsb2 n;
      var write;
      where write>=55;
      output out=w55 n=n;
    run;
    proc print data = w55;
    run;
    data _null_;
      set w55;
      call symputx('n55', n);
    run;
    %put &n55 Observations have write >=55;
    
    //   :9 Observations have write >=55
    //   :    %LET  
    
    data hsb2_55;
      set hsb2;
      w55 = symget('n55')+0;  //         (      )
    run;
    proc print data = hsb2_55;
      var write w55;
    run;
    

    SQLプロシージャステップマクロ変数の作成
  • 基本文法(同SQL言語)
  • proc sql <options>;
    	select    (    ) into : macro_var1 - :macro_var3
    	from   (t1,t2,t3)
    	where    
    	having    
    	order by    <desc>
    	group by     ;
    quit;
    //  :sql          
    
  • proc sql;
      select sum(write>=55) into :w55
      from hsb2;
    quit;
    %put w55 is &w55;
    //   :w55 is 9
    
    proc sql;
      select mean(write) into :write1 - :write3
      from hsb2
      group by ses;
    quit;
    %put write1 to write3 are &write1, &write2 and &write3;
    //   :write1 to write3 are 52.66667, 54.8 and 50.4
    

    マクロプログラム%macro %mend
    data file1 file2 file3 file4;
      input a @@;
      if _n_ <= 3 then output file1;
      if 3 < _n_<=  6 then output file2;
      if 6 < _n_ <= 9 then output file3;
      if 9 < _n_ <=12 then output file4;
    cards;
    1 2 3 4 5 6 7 8 9 10 11 12
    ;
    run;
    
    //                    
    data all;
      set  file1    file2    file3    file4
      ;
    run;
    
    %macro combine;
      data all_1;
        set
        %do i = 1 %to 4;
          file&i
        %end; 
        ;
      run;
    %mend;
    
    
    //SAS      --mprint:             SAS  。
    options mprint;
    %combine          
    //  :MPRINT(COMBINE):   data all_1;
    //      MPRINT(COMBINE):   set file1 file2 file3 file4 ;
    //      MPRINT(COMBINE):   run;
    
    
    //      
    %macro combine(num);
      data big;
        set
        %do i = 1 %to &num;
          file&i
        %end; 
        ;
      run;
    %mend; *executing the macro program;
    %combine(3)
    //   :
    // MPRINT(COMBINE):   data big;
    // MPRINT(COMBINE):   set file1 file2 file3 ;
    // MPRINT(COMBINE):   run;
    
    
    %macro gen(n,start,end);
      data generate;
        do subj=1 to &n;
    	  x=int(&End-&start+1)*ranuni(0)+&start);
    	  output;
    	end;
    run;
    proc print data=generate noobs;
      title "Randomly Generated Data Set with &n Obs";
      title2 "Values are integers from &start to &end";
    run;
    %mend gen;