配列名に対してinで抽出をかける

以下のようなデータセットがあったとします。
(作成法は適当です。
多分、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 件のコメント:

コメントを投稿