人真似をして結局失敗。飛び値がある場合の、数字→文字変換

リンクサイト「SAS忘備録」の記事「1行プログラムその3:数値を任意の文字に置き換える。」
http://sas-boubi.blogspot.jp/2014/03/13.html

を読んで、やっぱ凄いなぁと思いました。

で、記事の最後の方で、飛び番の場合は注意とありました。

実際、1='あり' 2='なし' 100='不明'というような変換が必要な場合ってよくあります。

if文とかselect文、或いはフォーマット作ってからそれを当てる以外に書き方ないかなぁと考えました。

data DT1;
 input V1;
 cards;
 1
 100
 2
 999
 ;
 run;









data DT2;
 array A{999} $10.;
  A{1}='なし';
  A{2}='あり';
  A{100}='不明';
  A{999}='もっと不明';
 set DT1;
  if V1^=. then V2=choosec(V1,of A{*});
 keep V1 V2;
run;







おっ、これならchoosec使えんじゃない?と思ったけども

それなら


data DT3;
 array A{999} $10.;
  A{1}='なし';
  A{2}='あり';
  A{100}='不明';
  A{999}='もっと不明';
 set DT1;
  if V1^=. then V2=A(V1);
 keep V1 V2;
run;


これでいいし、そもそもこんなにだらだらコードがかさむなら、if文と変わらないし、
全然1行コードから離れるし、駄目でした。


2 件のコメント:

  1. こんにちは。
    記事読んでいただいて有難うございます!
    SASYAMAさんの詰めSASシリーズが好きで、ちょっと真似して1行プログラムシリーズ始めちゃいました!

    まさに仰る通り、「999:不明」みたいなのがあるとネックなんですよね。。
    そういうのがない場合は、ここぞとばかり使ってますが。

    無理矢理かなぁと思って今回載せなかったのが、CHOOSECとWHICHNを組み合わせる方法で、、

    if V1^=. then V2 = choosec(whichn(V1,1,2,100,999),"なし","あり","不明","もっと不明");

    ここまでくると可読性わるくなりますよね。。
    このコンボは何か他の用途にも上手く使えそうな気はしてるんですが。

    返信削除
  2. ありがとうございます!

    いや、詰めSASシリーズ、問題考えるのは好きなんですけど
    結局出すだけ出しておいて
    いつもmatsuさんによりよい手を見つけてもらって申し訳ないなぁと思ってます。

    あ~、whichn使えますね!確かに!
    なんかtranwrdの変換対象と変換後の文字列をリスト形式で複数指定できればいいんですけどね。。

    返信削除