変数の値によって指定された変数の値をとる方法 VVALUEXによる裏技

なんのこっちゃいってタイトルですが、

今回は、簡単そうで意外とわからない処理の話です。

data Q1;
A='赤';B='い';C='歩';X='A';output;
A='青';B='ろ';C='金';X='C';output;
A='黄';B='は';C='飛';X='B';output;
run;


というデータセットがあるとします。

ここから











というデータセットが欲しいとします。

つまり、Xの中に入っている値は、Yにどの変数の値を持ってくるかを指示しているわけです。

さて、1つ1つ

if X='A' then Y=A; 
else if ・・・・と書いていいってもいいですが、仮に変数が100個とかあったら面倒ですね。

この処理を1行で書くことができます。
それは

data A1;
 set Q1;
  Y=vvaluex(X);
run; 

です。

これだけで、上記の結果がでます。


vvaluex?、vvalueじゃないんですね。この関数って本来どういうのでしたでしょうか?

本来は

data Q2;
X=1;
format X Z2.;
run;





のように、フォーマットが設定された変数に対して、その変数に設定されたフォーマット
を使って、putして文字変数を作ってくれる便利関数です(デフォのlengthはいつもの$200.)

data A2;
set Q2;
XV=vvalue(X);
XVX=vvaluex('X');
format X best.;
run;






わかりにくいですが、XVとXVXは文字型変数です。

でvvalue関数がそのまま変数を引数にとるのに対して、vvaluexは変数名の文字値を引数に
とるんですね!括弧の中のXによくみると、シングルコーテーションがついてます。

そして変数に特にフォーマットが設定されていなければそのままデフォルトのフォーマットをつかいますので、つまり値そのまんまということです。

その性質をうまく使ってるんですね!!

vvaluexというと、フォーマットでputするだけの関数と思わせておいてのこの離れ業!
面白いですね!


0 件のコメント:

コメントを投稿