ラベル [▼ My Favorite SAS Functions の投稿を表示しています。 すべての投稿を表示
ラベル [▼ My Favorite SAS Functions の投稿を表示しています。 すべての投稿を表示

2017年7月31日月曜日

My Favorite SAS Functions (10) CALL SYMPUTX



最後はコールルーチンになりますが、CALL SYMPUTXを紹介します。



構文

  CALL SYMPUTX(  "マクロ変数名" , 変数名  )


・指定した変数の両脇の半角スペースを取り除いたうえで、マクロ変数に格納する。

・数値変数を指定した場合、bestフォーマットを使って文字変換される。
(bestフォーマットに変換した値なので、元の変数値とは異なる (丸め処理が行われる) 場合があることにご注意ください)






それでは、CALL SYMPUTXを使わない場合と、使った場合を比較してみましょう。
以下は、数値変数 X の値をマクロ変数 Y に格納する例です。


Before
data _null_;
   X = 123456;
   call symput("Y", trim(left(put(X,best.))));
run;

%put "&Y";

ログ
"123456"

CALL SYMPUTの中で、「trim(left(put(X,best.)))」 として、
bestフォーマットで文字変換してから余計な両脇の半角スペースを取り除く処理をしていますが、なんて面倒なんだって感じですね。


以下、CALL SYMPUTX を使うとスッキリとした文になります。

After
data _null_;
   X = 123456;
   call symputx("Y",X);
run;

%put "&Y";

ログ
"123456"



📝ちなみに

CALL SYMPUT / SYMPUTX は以下記事で紹介済みですが、数値が丸められる話や、「ローカル・グローバルマクロ変数」の概念によってミスしがちな話など、詳しい挙動を書いているので是非こちらも参照下さい。



以上、過去記事の焼き直しみたいな記事が続いてしまいましたが、
それだけ便利かつアイディア次第で色々できる関数たちなので再度紹介してきました。

色々使い方考えるの楽しいので、SASプログラムを楽しむ人達が増えるといいなぁ。



記事一覧

1.CATS関数
10.CALL SYMPUTX

2017年7月27日木曜日

My Favorite SAS Functions (9) CALL MISSING



第9回目は、関数じゃなくてコールルーチンになりますが、CALL MISSINGを紹介。
指定した変数をすべて欠損値にする機能を持っています。


こちらもやっぱり過去記事で紹介済みです。
指定した変数をすべて欠損値にする【CALL MISSING】



さて、CALL MISSINGの使用前・使用後を見てみましょう。




以下のようなデータセットがあったとします。

data DT1;
   X1 = 123;
   X2 = 456;
   X3 = "abc";
run;
  X1  
  X2  
  X3   
 123 456  abc

ここで、変数 X1, X2, X3 を欠損値にしたいします。

普通に書くと以下のような感じですね。

Before
data DT2;
   set DT1;
   X1=.;
   X2=.;
   X3="";
run;
  X1  
  X2  
  X3  
   .   .  

数値変数だったら「数値変数=.;」
文字変数だったら「文字変数="";」
みたいな感じで書き方分けなきゃいけないし、面倒ですよね。

CALL MISSINGを使えば、もっと楽になります。

After
data DT2;
   set DT1;
   call missing(X1, X2, X3);
run;
  X1  
  X2  
  X3  
   .   .  

📝ちなみに

通常のデータセット以外で使用すると、WARNINGが出て機能しない事があるらしい?ので、ログとかも確認するようにして下さい

2017年7月21日金曜日

My Favorite SAS Functions (8) IFN / IFC関数



第8回目は、IFN / IFC関数。
IFステートメントの関数バージョンみたいなやつです。

これも大変便利なのでヘビーに使う関数のひとつですね。



構文

   IFN (  条件式  , 条件式が真(TRUE)の場合の戻り値 ,  条件式が偽(FALSE)の場合の戻り値 )


戻り値を数値で返したい場合はIFN関数を使い、文字値で返したい場合はIFC関数を使います。


以下記事ですでに紹介済みなので、まずはそちらをご覧ください。
IFN / IFC関数と謎の第4引数



では、IF関数を使わない場合と、使う場合とでプログラムを比較してみます。





例えば、以下のようなデータセットがあったとします。

data DT1;
   length X1 $10.;
   X1="YES"; output;
   X1="NO"; output;
run;

 X1 
   YES  
   NO 


ここで
・X1="YES" だったら「1」
・X1="YES" 以外だったら「0」
みたいな条件分岐で値を設定したいとします。

通常はIFステートメントを使いますよね。

Before
data DT2;
   set DT1;
   if X1 = "YES" then X2=1;
   else  X2=0;
run;
 X1
 X2
  YES      1  
  NO     0  


IFN関数を使えばもっとスッキリとした文になります。

After
data DT2;
   set DT1;
   X2 = ifn(X1="YES",1,0);
run;
 X1 
 X2
  YES      1  
  NO     0




記事一覧

1.CATS関数
8.IFN・IFC関数

2017年7月12日水曜日

My Favorite SAS Functions (7) CMISS関数



第7回目は、CMISS関数。
指定した変数のうち、欠損値の数を返してくれます。
おススメポイントが、数値変数・文字変数どちらも指定可能という点です。


基本的な使用例は以下記事で紹介済みなので、そちらをご覧ください。
欠損値のチェックを簡単に行う。



では、CMISSを使わない場合と、使う場合とでプログラムを比較してみましょう。





例えば、以下のようなデータセットがあったとします。

data DT1;
   X1=1;
   X2=.;
   X3="aaa";
run;

 X1 
 X2 
X3
   1    .  aaa 


この変数 X1~X3 のうち、いずれかが欠損値の場合、変数Yにフラグ「1」を立てたいとします。
まずはCMISSを使わない場合。

Before
data DT2;
   set DT1;
   if X1=. or X2=. or X3="" then Y=1;
run;
 X1 
 X2 
X3
 Y 
   1    .  aaa   1  


そしてCMISSを使う場合。

After
data DT2;
   set DT1;
   if cmiss(X1,X2,X3)>0 then Y=1;
run;
 X1 
 X2 
X3
 Y 
   1    .  aaa   1  


今回の例だとCMISSを使った成果が見えづらいですが、変数の数が多いと非常にスッキリとした文になります。


CMISSは便利なのに知名度が低いので、すごい勿体ない。




記事一覧

1.CATS関数
7.CMISS関数

2017年6月14日水曜日

My Favorite SAS Functions (6) VVALUE / VVALUEX関数



第6回目は、VVALUE / VVALUEX関数。
変数に割り当てられているFORMATを使って、その変数を文字変換した値を返してくれる関数です。

VVALUE関数については以下記事で紹介済みです。
http://sas-boubi.blogspot.jp/2013/12/put-vs-vvalue.html


では、例を見ていきましょう。





例えば、以下のようにフォーマット「YYMMDD10.」を割り当てた変数Xがあったとします。

data DT1;
  format X yymmdd10.;
  X = '13jun2017'd;
run;

  X  
 2017-06-13 


この変数XをYYMMDD10.形式のフォーマットで文字変換したい場合、普通以下のようにPUT関数を使いますよね。

Before
data DT2;
  set DT1;
  length Y $20.;
  Y = put( X, yymmdd10.);
run;
  X
Y
 2017-06-13 2017-06-13 


ここで、VVALUEまたはVVALUEX関数を使えば少しスッキリとした文になります。

After
data DT2;
  set DT1;
  length Y1 Y2 $20.;

  /* vvalue関数を使った例 */
  Y1 = vvalue( X );

  /* vvaluex関数を使った例 */
  Y2 = vvaluex( "X" );

run;
  X
Y1
Y2
 2017-06-13 2017-06-13  2017-06-13 




解説

Y1 = vvalue( X );

「 vvalue( X ) 」で変数Xに割り当てられているFORMAT「YYMMDD10.」を使って文字変換した値「2017-06-13」を返しています。


Y2 = vvaluex( "X" );

vvaluex も vvalue と同じ機能を持っているのですが、違いは以下の通り。

・vvalue( X )      … 変数名を指定
・vvaluex( "X" )  … 変数名を表す文字値を指定

つまり、「 vvaluex( "X" ) 」で変数Xに割り当てられているFORMAT「YYMMDD10.」を使って文字変換した値「2017-06-13」を返しています。


また、以下のような書き方も可能です。

  length VARNAME Y2 $20.;
  VARNAME = "X";
  Y2 = vvaluex( VARNAME );

変数名を格納した変数VARNAMEをVVALUEX関数の引数に指定することでも、
「vvaluex( VARNAME )」 → 「vvaluex( "X" )」 と展開されます。



注意点


PUT関数と挙動が似ています。
例えば、PUT関数で数値の欠損値を以下のようにFORMAT変換すると、、

  length Y3 $20.;
  Y3 = put( . , yymmdd10.);

→ 変換後の値は「         .」という感じで先頭に余計な空白が入ります。


また、フォーマットによっては、、

 length Y4 $20.;
 Y4 = put( 10, best12. );

→ 変換後の値は「          10」という感じでこちらも先頭に余計な空白が入る場合があります。


VVALUE / VVALUEX関数も同様に先頭に空白が入る場合があるのでご注意下さい


2017年5月26日金曜日

My Favorite SAS Functions (5) COALESCE / COALESCEC関数


第5回目は、COALESCE / COALESCEC関数。
お気に入り関数トップ3のうちのひとつです(あと2つは WHICHN、CHOOSEN)

この関数は「引数のうち最初に欠損値以外で登場する値を返す」という機能を持っています。


基本的な構文や機能は以下記事で紹介済みなので、そちらをご覧ください。
http://sas-boubi.blogspot.jp/2016/04/coalesce.html

データステップ100万回でも特集されてます。
http://sas-tumesas.blogspot.jp/2013/09/sas3null.html





上の過去記事でさんざん例を紹介済みな感じですが、あらためて。
以下X1~X3の中から最初に欠損値以外で登場する値を返したいとします。

  X1  
  X2  
  X3  
   

  aa  bb  aa  



以下、COALESCEC関数を使わない場合(Before)と、使う場合(After)。

Before
  length Y $2.;
         if X1^="" then Y=X1;
  else if X2^="" then Y=X2;
  else if X3^="" then Y=X3;

After
  length Y $2.;
  Y = coalescec( X1,X2,X3 );


いいですね~このスッキリ感がたまらないですね。

ちなみにCOALESCE関数あるあるだと思うんですが、読み方が最初よく分からなくて、綴りをいちいち調べてた時期がありました。

コアレスと読むそうです。
上にリンク貼ったSASYAMAさんの記事でもコールエッセって読んでたってお話しがありますね。
私はコアレスシって読んでました。



記事一覧

1.CATS関数
5.COALESCE・COALESCEC関数

2017年5月20日土曜日

My Favorite SAS Functions (4) CHOOSEN / CHOOSEC関数


第4回目は、CHOOSEN / CHOOSEC関数。
これもいい関数ですよ!



構文


    CHOOSEN( Y , X1 , X2 , X3 , … )


・Y番目のXの値を返す。
・第2引数以降に数値型の変数または値を指定する場合はCHOOSEN関数を用いる。
・第2引数以降に文字型の変数または値を指定する場合はCHOOSEC関数を用いる。





以下のように、X1~X3のうち、Y番目の値を取得したいとします。。

  X1  
  X2  
  X3  
  Y  
  XVAL  
  aa    bb  cc  2     bb


以下、CHOOSEC関数を使わない場合(Before)と、使う場合(After)。

Before
  length XVAL $2.;
  if Y = 1 then XVAL=X1;
  if Y = 2 then XVAL=X2;
  if Y = 3 then XVAL=X3;


After
  length XVAL $2.;
  XVAL = choosec( Y ,X1,X2,X3 );



こんな感じでスッキリとした文になるんでよく使います。今日も使いました。


他の便利な使い方を過去記事でも紹介してるので是非見てくださいね。
http://sas-boubi.blogspot.jp/2014/03/12_25.html

2017年5月15日月曜日

My Favorite SAS Functions (3) WHICHN / WHICHC関数


第3回目は、一番お気に入りの WHICHN / WHICHC関数です。
お気に入りすぎて、WHICHN関数使ってる夢みたことあります。



構文


    WHICHN( Y , X1 , X2 , X3 … )


・Yと同じ値がXの何番目に初登場するか返す。
・Yと同じ値がXに無い場合、0を返す。
・Yが欠損値の場合、欠損値を返す。
・引数に数値型の変数または値を指定する場合はWHICHN関数を用いる。
・引数に文字型の変数または値を指定する場合はWHICHC関数を用いる。





以下のように、Y の値が X1~X3 の何個目と同じか知りたいとします。

  Y  
  X1  
  X2  
  X3  
  XNUM  
  bb    aa  bb  cc     2


以下、WHICHC関数を使わない場合(Before)と、使う場合(After)。

Before
  if Y = X1 then XNUM=1;
  else if Y = X2 then XNUM=2;
  else if Y = X3 then XNUM=3;


After
  XNUM = whichc( Y ,X1,X2,X3 );



過去記事でもとりあげてるので、是非読んでみてください。


2017年5月11日木曜日

My Favorite SAS Functions (2) CATX関数



第2回目は、CATX関数。
この関数は「文字列同士を区切り記号付きで連結する」という機能を持っています。


構文

  CATX( "区切り文字" , 変数1, 変数2, ・・・ )


  • 変数値の先頭か末尾に半角スペースがある場合は、それらを削除してから結合する
  • 文字変数が欠損値の場合は、その変数はスキップされる (区切り文字もつかない)

基本的な構文や機能は以下記事で紹介済みなので、そちらをご覧ください。
http://sas-boubi.blogspot.jp/2015/11/catx.html





例えば、以下X1~X4までの変数値を連結してYのような文字列を作りたいとします。

  X1  
  X2  
  X3  
  X4  
   
  aa      bb  cc  aa,bb,cc 


今までは、以下Beforeのようなメンドクサイ書き方をする必要ありました。あー面倒だなーって言いながら書いてました。
それがAfterのようにCATX関数を使えば超スッキリと短い文で書けてしまいます。

Before
  length Y $20.;
  array AR(*) X1-X4;
  do i=1 to dim(AR);
     if AR(i)^="" then do;
        if Y = "" then Y=left(AR(i));
        else Y = trim(left(Y)) || "," || trim(left(AR(i)));
     end;
  end;


After
  length Y $20.;
  Y = catx( "," ,X1,X2,X3,X4 );


今でこそ当たり前につかってますが、知ったときは感動しました。



記事一覧

1.CATS関数
2.CATX関数

2017年5月9日火曜日

My Favorite SAS Functions (1) CATS関数



個人的にお気に入りかつ使いこなすと便利な関数を紹介したいと思います。
まずは一番ヘビーに使うCATS関数から。



構文


    CATS( 変数1, 変数2, … )


指定した変数または値を結合する。
(変数または値の両脇の半角スペースは取り除いたうえで結合されます。)





今まで文字を結合する時は、以下Beforeのような書き方が定着しています。
それがCATS関数を使えば超スッキリと短い文で書けてしまいます。

Before
  length Y $20.;
  Y = trim(left(X1)) || trim(left(X2)) || trim(left(X3));


After
  length Y $20.;
  Y = cats(X1,X2,X3);





また、CATS関数にはもう1個便利な機能があります。SASYAMAさんが過去に紹介されてる以下を読んでください。
http://sas-tumesas.blogspot.jp/2015/06/cat.html

CATS関数に指定した変数が数値型の場合、BESTフォーマットを当てて文字値にしてくれるという機能を利用した小技ですね。
気をつけたいのが、BESTフォーマットに変換した値なので、元の変数値とは異なる(丸め処理が行われる)場合があることにご注意ください。

特に整数値を文字変換したい場合に使えます。
例えば「N=10」みたいな感じでN数を表す文字列を作りたい場合、以下Beforeのように書いていたところをAfterのように書けてしまいます。

Before
  length Y $20.;
  Y = "N=" || left(put(X,best.));


After
  length Y $20.;
  Y = cats("N=", X);





記事一覧

1.CATS関数