以下のようなデータセットがあったとします。
(作成法は適当です。
多分、0.4の確率で'A',0.5で'B',0.1で'C'となる3変数で構成されるデータセットになっているはずです)
data Q1;
call streaminit(12345);
do i=1 to 15;
X_1=strip(translate(put(rand('table',0.4,0.5,0.1),best.),'ABC','123'));
X_2=strip(translate(put(rand('table',0.4,0.5,0.1),best.),'ABC','123'));
X_3=strip(translate(put(rand('table',0.4,0.5,0.1),best.),'ABC','123'));
drop i;
output;
end;
run;
X_1 X_2 X_3を配列AXとする時に、配列AX内のいずれかの要素が値'C'をとる
オブザベーションのみ出力せよ。
といった問題があるとします。
欲しいのは以下のデータセットです
最近まで、本当に知らなかったんですが
data A;
set Q1;
array AX{*} X_:;
if 'C' in AX then output;
run;
これで詰みなんですね。値 in 配列名 で通るなんて、びっくりですよ。
基本的な知識だと言われたのですが、こんなんどこで習うの?知らなかったの僕だけですか?
どうぜ、そういうことって、他にもいっぱいあって、
知ってれば簡単に済む処理を、日々、無駄なコードをこねくりまわして
作っているだろうな、僕は! と切なくなりました。
てっきり
data A0;
set Q1;
array AX{*} X_:;
if count(cats(of AX{*}),'C')>0;
run;
とか
data A1;
set Q1;
array AX{*} X_:;
do i=1 to dim(AX);
if AX{i}='C' then do;
output;
leave;
end;
end;
drop i;
run;
が正解かと思ってましたよ。
0 件のコメント:
コメントを投稿