あまり紹介されている書籍が多くない気がするので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を使います。
データステップ中で、
返信削除NewV=%D2C( Var );
のようにして変数名のみ指定すれば、その変数のフォーマットを利用して、その変数の値に対応するフォーマットの文字列のデータを作るマクロ%D2Cを作成したいのですがうまくいきません。
下記のようにすれば、
%macro D2C( Var );
left( putN( &Var, vformat( &Var ) ) )
%mend;
数値変数の場合はうまくいくのですが、数値変数でも文字変数でも共通に使えるマクロにしたいのです。
よい方法がありましたらお教えください。
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オブザベーション目で、数字の欠損が[.]という文字になってしまっていることです。
欠損が入らないデータであれば、このマクロのままでいいですが、入る可能性がある場合は、[.]を除去する関数を加えるなど、状況に応じてカスタマイズしてみてください。
もしかしたら、今回のケースではあえてマクロにする必要がないかもしれません。
SAS YAMAさん
返信削除不可能との回答が当然返ってくると思っていましたが、こんなに速く驚きました。
私の欲しかったそのものです!ありがとうございました。
さらに試作で使っていたformatがYAMAさんと同じだったので感激です。
うまくいって良かったです!
削除あ、format同じでしたか、奇遇ですね。
vvalue関数、実は僕も1年ぐらい前まで知らずに、scdentさんのように、関数組み合わせてやりくりしていたんですが、ブログ「SAS忘備録」の作者のmastuさんに直接教えて貰って。
知った時は、愕然としました、こんな便利な関数あるのに、今まで何年も僕は何をしてたのかと。
また何かありましたらいつでもコメントください。
SASは公式のトレーニングが高かったり、本が少ないので、結局は使う人同士の教え合いに限ると思ってます。