自動変数_i_って何?って話と、2つの配列に共通の値があるかでフラグたてる話

ちょっと最近、知ったばっかりのことで、
間違ってたら教えて欲しいのですが。

以下のようなデータがあって

data Q1;
A=1;B=2;C=3;X=4;Y=5;Z=6;output;
A=4;B=7;C=5;X=2;Y=6;Z=4;output;
A=8;B=6;C=9;X=2;Y=4;Z=6;output;
A=1;B=2;C=8;X=3;Y=9;Z=5;output;
run;










A B Cで配列AR1、  X Y Zで配列AR2を作って、
それぞれの要素番号2についてログに出したければ


data A1;
 set Q1;
 array AR1{*} A B C;
 array AR2{*} X Y Z;

 put AR1{2}= AR2{2}=;

run;

ログには







となります。
ここまではOKですね。

次に非明示添字配列を考えてみます。
明示・非明示とは、AR1{*}やAR1{3}などのように配列名の後に
要素数を添字で明示するのが明示配列、しないのが非明示配列です。

【参考記事】非明示添字配列と do over LOOPの利用
http://sas-tumesas.blogspot.jp/2014/01/do-over-loop.html

非明示配列は要素数を定義しませんが、実は内部的には
要素番号が振られているため、以下のように書けます。

data A2;
set Q1;
array AR1 A B C;
array AR2 X Y Z;

put AR1{2}= AR2{2}=;

run;

しかし、実はなんと以下のようにも書けるらしんです

data A3;
set Q1;
array AR1 A B C;
array AR2 X Y Z;
_i_=2;
put AR1= AR2=;

run;

結果は同じ








_i_って!そんなのがあるんですね~。
こいつ、実は_N_と同じで、出力データセットから自動にドロップ
される、見えない系の自動変数です。
配列のインデックスをつかさどる自動変数のようですね。
つまり、普段の明示配列で、iとかでループして分岐するような
処理について非明示配列では_i_を使って条件分岐できるというわけ
ですね。

2番目の要素が7の時に★つけてだせと言われれば

data _NULL_;
set Q1;
array AR1 A B C;

do over AR1 ;
if _i_ = 2 and AR1= 7 then put "★" AR1=;
else put  AR1=;
end;

run;

















みたいな。いや、最初に言ったように非明示でも
普通にAR1{2}=7と書きゃいいんですけどね。

_i_の活用法でいいの知っている方がいたら是非教えてください。

さて、今までの話と特に関係ないんですが、配列関係でたまに聞かれる
処理があるので少し紹介。

それは配列AR1にある値が配列AR2に存在するかを調べて
フラグを立てるみたいな処理です。

多分、以下のようにかけると思います


data A4;
set Q1;
array AR1{*} A B C;
array AR2{*} X Y Z;

do i = 1 to dim(AR1);
if AR1{i} in AR2 then FL=1;
end;
run;

結果は








非明示なら以下のように書けます。

data A4;
set Q1;
array AR1 A B C;
array AR2 X Y Z;

do over AR1;
if AR1 in AR2 then FL=1;
end;

run;

0 件のコメント:

コメントを投稿