SAS学習ノート(九)—SASマクロ
15222 ワード
文書ディレクトリマクロ変数 マクロ関数 symputxルーチンとsymget関数 SQLプロシージャステップマクロ変数作成 マクロプログラム マクロ変数
重複する変数とコードを置き換えることができます定義: 引用(解析): 間接参照: 出力: すべてのシステムに付属/ユーザカスタム/すべてのマクロ変数を出力: 区切り記号 グローバルマクロ変数(マクロプログラム以外で定義)VS.ローカルマクロ変数 削除: マクロ関数
マクロ文字列処理関数のパラメータは、固定テキスト、マクロ変数参照、マクロ関数、マクロ呼び出しなどの任意のテキストおよび(または)マクロトリガであってもよい.固定テキストパラメータには引用符は必要ありません共通関数 マクロ関数
使用方法
機能
%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ルーチン——マクロ変数にデータステップの情報を渡す パラメータ1は、作成中のマクロ変数がデータステップで伝達している情報を格納している パラメータ2は文字列形式の値 新しいマクロ変数はテキスト型で、一致引用符で囲む Symget関数——マクロ変数の情報をデータステップに伝える パラメータは、マクロ変数の名前、文字列変数または文字式であってもよい.
動的付与マクロ変数
SQLプロシージャステップマクロ変数の作成基本文法(同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;
%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関数
異なるプロシージャ・ステップでのデータの転送を実現
CALL SYMPUTX(“new_macro-variable”, value_in_string)
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プロシージャステップマクロ変数の作成
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 #
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;