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 ;

コメント

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意