SASで自分がよく使う関数のメモ書き
input/put:数値/文字の変換やフォーマットを使った変換
新規数値変数 = input( 文字変数 , best. );
新規文字変数 = put( 数値変数 , best. -L );
など
数値なのか文字なのかはけっこう大事
A = put( 12 , z3. -L );
でA = "012"などゼロパティングなども可能
(00ABとか文字もできたっけ?)
substr:範囲抽出
substr( "zzzzaaaaqqqq" , 1 , 10 )でzzzzaaaaqq
substr( "zzzzaaaaqqqq" , 5 )でaaaaqqqq
cmiss:変数値が欠損値になっている変数をカウント
X = cmiss( A , B , C );
%* (Aだけ欠損なら1,AとBのみ欠損なら2などとなる) *;
coalesce/coalescec:引数のリストから最初の非欠損値をかえす
%* coalesceが数値版/coalescecが文字版 *;
A = coalesce( . , 1 , 2 );
↑ならA = 1
cats:変数の両端からブランクを除きながら結合
引数が1個なら両端からブランク削除するだけ
A = cats( " a " ); %* A = "a" *;
B = cats( " a " , "b " ); %* B = "ab" *;
%* ※数値変数を入れることもできる *;
C = cats( 1 , "2" ); %* C = "12" *;
D = cats( 10 ); %* D = "10" *;
choosen/choosec:後続の引数からの選択結果をかえす(1つめの引数が場所を表す)
%* choosenが数値版/choosecが文字版 *;
A = choosen( 3 , 10 , 50 , 20 , 40 , 30 ); %* A = 20 *;
B = choosec( 2 , "aaa" , "bbb" , "ccc" , "ddd" , "eee" , "fff" ); %* B = "bbb" *;
whichn/whichc:choose系の逆版(後続の引数と一致した場所を返す)
A = whichn( 1 , 2 , 4 , 5 , 1 , 2 , 3 ); %* A = 4 *;
B = whichc( "aaa" , "abc" , "aaa" , "bbb" , "grgfwer" , "wfefwewfef" ); %* B = 2 *;
コードリストの変換や変換前にするのにchooseやwhich系は便利
また、whichnは以下のような使い方もよくする
data work.DATA_ALL;
set DATA1( in = in1 ) DATA2( in = in2 ) DATA3( in = in3 );
DATA_FLG = whichn( 1 , in1 , in2 , in3 );
%* of in1 - in3などでも可 *;
run ;
とすると、縦結合したとき元のデータセットを判断できる変数DATA_FLGを作れる
compress:指定した文字の削除/指定した文字のみ残す
A = compress( XXX ); %* 変数XXXのブランク削除をしたものを格納 *;
B = compress( XXX , "asdfg" ); %* 変数XXXからa,s,d,f,gを削除したものを格納 *;
C = compress( XXX , "qwert" , "K" ); %* 変数XXXからq,w,e,r,tのみ残したものを格納(Kが残すための指定) *;
%* 数値を残すならcompress( XXX , , "KD" )とすることも可能 *;
KDだとマイナスの「-」は残らない→compress( XXX , "0123456789.-" , "K" )なら小数点やマイナスも残せる
文字列の削除
A = transtrn( XXX , "文字列" , cats( "" ) ); * catsはcompressでも可 *;
B = transtrn( "aa1a2" , "aa" , cats( "" ) ); %* B = "1a2"(12とはならない) *;
※ transtrn( "aa1a2" , "aa" , cats( "" ) ) だと" 1a2"
また、catsやcompress等つけないと、ブランクが残る