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行コードから離れるし、駄目でした。
こんにちは。
返信削除記事読んでいただいて有難うございます!
SASYAMAさんの詰めSASシリーズが好きで、ちょっと真似して1行プログラムシリーズ始めちゃいました!
まさに仰る通り、「999:不明」みたいなのがあるとネックなんですよね。。
そういうのがない場合は、ここぞとばかり使ってますが。
無理矢理かなぁと思って今回載せなかったのが、CHOOSECとWHICHNを組み合わせる方法で、、
if V1^=. then V2 = choosec(whichn(V1,1,2,100,999),"なし","あり","不明","もっと不明");
ここまでくると可読性わるくなりますよね。。
このコンボは何か他の用途にも上手く使えそうな気はしてるんですが。
ありがとうございます!
返信削除いや、詰めSASシリーズ、問題考えるのは好きなんですけど
結局出すだけ出しておいて
いつもmatsuさんによりよい手を見つけてもらって申し訳ないなぁと思ってます。
あ~、whichn使えますね!確かに!
なんかtranwrdの変換対象と変換後の文字列をリスト形式で複数指定できればいいんですけどね。。