PUTN(PUTC)関数の話

多分、基本的な関数として知っている人が多いかもしれませんが
あまり紹介されている書籍が多くない気がするのでPUTN(PUTC)関数の紹介です。
(確か以前、SAS Technical NewsのQAで見た気がしますが)

proc format;
 value UMU 1='有'
           2='無'
          ;
 value SEX 1='男'
           2='女'
          ;
run;

上記のようなフォーマットがあったとします。

そして

data Q1;
X=1;FMT='SEX';output;
X=2;FMT='UMU';output;
X=1;FMT='UMU';output;
X=2;FMT='SEX';output;
run;








このようなデータセットがあり、変数Xの値に対して
どのようなフォーマットをあてるかが、変数の中に値(フォーマット名)で
格納されているとします。

そうした場合以下のようにPUTN関数に、文字化したい変数と、対応するフォーマット名の格納された変数を指定します

data A1;
 set Q1;
 Y=putn(X,FMT);
run;







で、これの文字フォーマット版がPUTC関数です。

逆に指定したインフォーマットで値を読み込みたい場合は
INPUTN INPUTCを使います。

4 件のコメント:

  1. データステップ中で、

    NewV=%D2C( Var );

    のようにして変数名のみ指定すれば、その変数のフォーマットを利用して、その変数の値に対応するフォーマットの文字列のデータを作るマクロ%D2Cを作成したいのですがうまくいきません。

    下記のようにすれば、

    %macro D2C( Var );
    left( putN( &Var, vformat( &Var ) ) )
    %mend;

    数値変数の場合はうまくいくのですが、数値変数でも文字変数でも共通に使えるマクロにしたいのです。
    よい方法がありましたらお教えください。

    返信削除
    返信
    1. scdentさん

      コメント有難うございます。
      なるほど、既にその変数に対応するフォーマットが設定されている今回のケースあれば、vvalue関数が有効だと思われます。

      詳しくは
      http://sas-boubi.blogspot.jp/search/label/%E9%96%A2%E6%95%B0%3A%20VVALUE

      を読んでいただくとして、vvaluseは引数が文字でも数値でも使えます。

      ので以下のサンプルを実行していただいて、僕の理解が間違っていないかをご確認ください。

      %macro D2C( Var );
      left( vvalue( &Var))
      %mend;

      proc format;
      value SEX 1='男性'
      2='女性';
      value $YN 'Y'='はい'
      'N'='いいえ';
      run;

      data BASE;
      X=1;Y='N';Z=7650;output;
      X=2;Y='Y';Z=7750;output;
      X=3;Y='';Z=.;output;
      format X SEX. Y $YN. Z yymmdds10.;
      run;

      data OUTPUT;
      set BASE;
      X_=%D2C(X);
      Y_=%D2C(Y);
      Z_=%D2C(Z);
      run;

      この方法のひとつ改善点は、3オブザベーション目で、数字の欠損が[.]という文字になってしまっていることです。
      欠損が入らないデータであれば、このマクロのままでいいですが、入る可能性がある場合は、[.]を除去する関数を加えるなど、状況に応じてカスタマイズしてみてください。

      もしかしたら、今回のケースではあえてマクロにする必要がないかもしれません。

      削除
  2. SAS YAMAさん

    不可能との回答が当然返ってくると思っていましたが、こんなに速く驚きました。

    私の欲しかったそのものです!ありがとうございました。

    さらに試作で使っていたformatがYAMAさんと同じだったので感激です。

    返信削除
    返信
    1. うまくいって良かったです!
      あ、format同じでしたか、奇遇ですね。

      vvalue関数、実は僕も1年ぐらい前まで知らずに、scdentさんのように、関数組み合わせてやりくりしていたんですが、ブログ「SAS忘備録」の作者のmastuさんに直接教えて貰って。
      知った時は、愕然としました、こんな便利な関数あるのに、今まで何年も僕は何をしてたのかと。

      また何かありましたらいつでもコメントください。
      SASは公式のトレーニングが高かったり、本が少ないので、結局は使う人同士の教え合いに限ると思ってます。

      削除