ラベル 関数: CATS の投稿を表示しています。 すべての投稿を表示
ラベル 関数: CATS の投稿を表示しています。 すべての投稿を表示

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関数

2014年9月17日水曜日

変数値をマクロ変数に格納する方法「CALL SYMPUTX編」




SASを覚えはじめたという方から、この質問を頂くことが多いので解説したいと思います。
(最後に注意点の記事リンクも貼ったので、そちらも要参照)


* サンプルデータ ;
data DT1;
input A$ B$ @@;
cards;
001 AA 002 BB 003 CC
;

 
B
 001
 AA
 002
 BB 
 003
 CC 



上記の変数A,Bの値をマクロ変数に格納してみましょう。

* 変数値をマクロ変数に格納 ;
data _null_;
    set  DT1  end=_EOF;
    if  _EOF then call symputx("OBS", _N_);
    call symputx( cats("A",_N_) , A );
    call symputx( cats("B",_N_) , B );
run;

* ログにマクロ変数値を展開 ;
%macro MAC;
    %do i=1 %to &OBS;
         %put  &&A&i  &&B&i;
    %end;
%mend;
%MAC;

ログ
001  AA
002  BB
003  CC


上記青字部分の解説

end = 一時変数名 
最後のオブザベーションを読み込んだ時、一時変数に「1」が入る。
一時変数名は任意の名前でOK
call symputx
構文・・・call symputx("マクロ変数名", 格納したい値 )
値をマクロ変数に格納する。
_N_
SASの自動変数で、データステップの反復回数が格納されている。
つまり、読み込んだオブザベーションに対して、1~連番をふったような値が入る。
cats関数
構文・・・cats(値1値2 … )
値の両端の半角スペースを取り除いて結合する。
%doループ
%do マクロ変数名 = 開始値  %to 終了値;
%end;
マクロ変数の値を開始値から終了値まで変化させながら、ループさせる。


処理の流れ

data _null_;
    set  DT1  end=_EOF;
    if  _EOF then call symputx("OBS", _N_);
最後のオブザベーションを読み込んだ時に、_N_の値をマクロ変数OBSに格納している。
(つまりオブザベーション数をマクロ変数に格納)

    call symputx( cats("A",_N_) , A );
    call symputx( cats("B",_N_) , B );
run;
変数Aについて
1オブザベーション目の値をマクロ変数A1に
2オブザベーション目の値をマクロ変数A2に
・・・と次々マクロ変数に格納していく。変数Bも同様。

%macro MAC;
    %do i=1 %to &OBS;
         %put  &&A&i  &&B&i;
    %end;
%mend;
%MAC;
%DOでマクロ変数 i の値を1,2,3…と変化させながら、オブザベーションの数だけループさせる。
%PUTを使って、マクロ変数A1,B1,  A2,B2, ・・・の値をログに展開していく。



📝注意点

「CALL SYMPUTX」で数値をマクロ変数に格納すると丸められる場合があるので注意
今回のテクニックの中で使用している「_N_」と「END=オプション」は「サブセット化IF」と一緒に使用すると正しく動かなくなる事があります。
(解説記事:「サブセット化IFでありがちな落とし穴」)


次回はSQLプロシジャを使った方法を紹介。


2014年3月4日火曜日

半角スペースを取り除いてくれる関数達




余計な半角スペース(空白)を削除する方法をいくつか紹介。





📝今回紹介する関数の中で「STRIP関数」と「COMPRESS関数」は日本語等のマルチバイト文字に対応していないので注意!
(バージョンによってマルチバイトへの対応が変わっているので詳細はリファレンスを参照下さい)

data DT1;
    VAR1 = " a   b";

    * ① 両端の半角スペースを除去 ;
    A = stripVAR1 );

    * ② 連続する半角スペースを1つの半角スペースに置換 ;
    B = compbl( VAR1 );

    * ③ 全ての半角スペースを除去 ;
    C = compress( VAR1 );
run;

結果
VAR1 a   b
Aa   b
B a b
Cab



私自身は、①のSTRIP関数の代わりに「cats(VAR1)」と書いたりしてます。
CATS関数は変数や文字の値を連結してくれる関数です。
連結する際に、各引数の両端の半角スペースを除去してくれます。

cats(" a ",  " b c ",  " d ") → "ab cd"

「cats(VAR1)」と書くと、単純に両端の半角スペースを取り除いてくれるだけなので、使い勝手がよい関数です。


注意点

以下の記事で触れていますが、末尾の半角スペースを取り除いても、その結果を変数に格納した時点で、結局末尾に半角スペースが入ってしまうんで、そこの取り扱いだけ注意。