0 オブザベーションのデータセットに対して、data ステップを実行したい! - SAS
去年、特定のformatに対して処理をしたい - SASという記事を書いたのだけど、「あれ、このコード、対象のデータセットが 0オブザベーションだと処理されないんじゃ・・・・」ということに気づきました。ずっと、解決する方法を模索していたのですが、ようやく解決方法が1つ思いついたので(ちょっと無理矢理感がある方法ですが)、記事にしてみたいと思います。
下記に、0オブザベーションのデータセットを実行するための、コードを記載しています。
/* テスト用データセット */
proc sql ;
create table TEST
(
NUM DECIMAL format=10.
,DT DECIMAL format=date9.
,STR CHAR(10)
)
;
quit ;
/* 1オブザベーションのデータセット */
data KARA ; KARA=. ; run ;
data TEST ;
set TEST KARA(in=SW drop=KARA) ;
putlog "◆◆◆◆◆ 実行されたよ! ◆◆◆◆◆" ;
/* オブザベーションが追加されないように削除します */
if SW then delete ;
run ;
まず、proc sql の create table で 0 オブザベーションのデータセット TEST を作成します。その次に、1オブザベーションのデータセットを作成します。このデータセットの名前や変数はテキトーでいいです。
最後のdataステップが本題です。データセット TEST は 0オブザベーションですが、データセット KARA は 1オブザベーションあるので、ステップ内が1回実行されます。最後に、空のオブザベーションが、データセット TEST に追加されないように delete で削除しておきます。
今回の目的ではありませんが、この方法なら、全変数欠損値のオブザベーションも作れますね。
特定のformatに対して処理をしたい - SASにて、記載したコードの改良版は、以下のようになります。
data TEST ;
set TEST KARA(in=SW drop=KARA) ;
array TMP_NUM _numeric_ ; /* 数値項目を配列に格納 */
do over TMP_NUM ;
_format = vformat(TMP_NUM) ; /* 変数のformatを格納(英数字大文字) */
_name = vname(TMP_NUM) ; /* 変数名を格納 */
putlog _name _format ;
/* 特定のformatだけ処理する */
if (_format = "YYMMDDN8.") then putlog "correct!" ;
else putlog "false" ;
end ;
if SW then delete ;
run ;
コメント
コメントを投稿