以下のデータを見てください。
*** サンプルデータ ; data DT1; input A B @@; cards; 1 100 2 . 3 200 4 . 5 400 6 . ;
|
このデータで、まずはBの値を単純にRETAINした変数B2を作ってみます。
*** Bの値をRETAIN ; data OUT1; set DT1; retain B2; if B ^=. then B2 = B; run;
|
次が問題。
たまに特定条件の時だけ、RETAIN機能を無効にしたい事があります。
たとえば、以下のように A=3 の時だけ、RETAINしたくないとします。
(3オブザベーション目の 「200」 が次のオブザベーション以降に保持されないようにする)
A
|
B
|
B2
|
---|---|---|
1
|
100
|
100
|
2
|
.
|
100
|
3
|
200
|
200
|
4
|
.
|
.
|
5
|
400
|
400
|
6
|
.
|
400
|
*** A=3の時だけ、RETAIN機能を無効にする ; data OUT2; set DT1; retain B2; if B ^=. then B2 = B; output; if A=3 then B2=. ; run; |
上の赤文字が追加した文。
データセットDT1の3オブザベーション目に対する処理の動きを説明すると、
①「output;」で3オブザベーション目の現状の処理結果をデータセットに出力してから、
②「if A=3 then B2=.;」で A=3 の場合にB2を初期化(欠損値に)しています。
上記①で3オブザベーション目に対する処理結果をデータセットに出力済みなので、②の処理は3オブザベーション目の処理としてはデータセットに反映されず、PDV (処理が行われる一時的な箱) のみに保持されています。
このPDV内のB2は、「retain B2;」により次のオブザベーションを読み込む際にもその値が引き継がれます。
③ 上記②でPDVのB2が初期化された場合、次のオブザベーションには欠損値になったB2が引き継がれる(=RETAIN機能が無効になる)、というわけです。
0 件のコメント:
コメントを投稿