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 ;
コメント
コメントを投稿