2018年2月27日火曜日

CALL CATS / CATX の使いどころ



CATS・CATX関数はご存知でしょうか?
ご存知ないって方は、むかし書いた記事をご覧ください。

http://sas-boubi.blogspot.jp/2017/05/my-favorite-sas-functions-1-cats.html
http://sas-boubi.blogspot.jp/2017/05/my-favorite-sas-functions-2-catx.html


ここから本題
上で紹介した関数とは別に「CALL CATS」,「CALL CATX」ってのもあります。



構文


  CALL CATS( 結果を格納する変数,   変数1, 変数2,… 変数n )


変数1 ~ 変数n の値を結合し、第1引数に指定した変数に結果を格納します。



  CALL CATX( 区切り文字, 結果を格納する変数,   変数1, 変数2,… 変数n )


変数1 ~ 変数n の値を区切り文字付きで結合し、第2引数に指定した変数に結果を格納します。



つまり、CATS関数で以下のように書いていた文が、、
Y = CATS( X1,X2,X3 );

CALL CATSだと以下のように書けます。
CALL CATS( Y, X1,X2,X3 );




「CALL CATS」「CALL CATX」の使いどころ

CATS関数を例に、以下のケースを考えてみます。

data DT1;
    length RESULT $200.;
    X1 = "ab";
    X2 = "cd";
    X3 = "bc";

    /* CATS関数で文字を結合 */
    array AR(*) X1-X3;
    do i = 1 to dim(AR);
       if index(AR(i),"c") then RESULT = cats( RESULT,AR(i) );
    end;
run;

 RESULT  X1  X2  X3 
  cdbc  ab cd  bc

X1~X3 の中で変数値に "c" が含まれているものを結合して変数RESULTに格納しています。


以下は、CALL CATS を使う場合。

    array AR(*) X1-X3;
    do i = 1 to dim(AR);
       if index(AR(i),"c") then call cats( RESULT,AR(i) );
    end;



正直、CATSでもCALL CATSでも文の長さは変わらないのでどっちでもいいんですが、なんとなく
RESULT = cats( RESULT,AR(i) );

と書くより、
call cats( RESULT,AR(i) );

と書く方が綺麗じゃないですか?こっちだと同じ変数名を2回書く必要がないから。



このように、「結果変数 = cats( 結果変数, 変数1,変数2… )」みたいな書き方になる場合は CALL CATS を使う方が良いように思います。(個人的に)





2 件のコメント:

  1. すみませんが、上記綺麗な書き方のコードを実行したら、結果は下記となっています。
    RESULT X1 X2 X3 i
    cdbc ab cd bc 4

    返信削除
  2. RS2018さん、ご指摘ありがとうございます。
    「変数値に "c" が含まれているものを結合」なので、結果は"cdbc"となるのが正しかったですね。。
    早速、修正致しました。有難うございます!

    返信削除