前のページ|次のページ

LOSTCARDステートメント

1オブザベーションあたりのレコードが複数あるデータに欠損レコードや無効なレコードが検出された際に、入力データを再同期します。

該当要素: DATAステップ
カテゴリ: アクション
種類: 実行

構文

LOSTCARD;

引数なし

LOSTCARDステートメントを使用すると、現在のグループに欠損レコードが含まれている場合、次のグループからレコードを読み込まないようにします。

詳細

LOSTCARDを使用する必要がある場合

複数のレコードを読み込んで1つのオブザベーションを作成する場合、データの最後に到達するまでレコードの欠損は検出されません。データ内に欠損レコードが存在すると、SASデータセットの後続のオブザベーションの値に誤りが生じる可能性があります。LOSTCARDステートメントを使用すると、現在のグループのレコード数が予測よりも少ない場合、次のグループからデータを読み込まないようにします。
LOSTCARDステートメントは、1オブザベーションあたりの入力データのレコード数が固定されている場合や、オブザベーションの各レコードに同じ値のID変数が使用されている場合に便利です。通常、LOSTCARDステートメントは、IF-THENステートメントのTHEN句やSELECTグループのステートメントなどの条件付き処理の中で使用されます。

LOSTCARDステートメントの実行

LOSTCARDステートメントを実行すると、次に示す複数のステップが実行されます。
  1. LOSTCARDメッセージ、ルーラー、現在のオブザベーションを作成しようとして読み込んだすべてのレコードの3つがSASログに書き込まれます。
  2. 読み込み中のレコードグループにある最初のレコードを破棄し、オブザベーションには書き込まずに、DATAステップの先頭に処理を戻します。
  3. 自動変数_N_の値に1を追加しません。(通常は、DATAステップの先頭に戻ったときに自動変数_N_の値を1ずつ増やしていきます。)
  4. グループ内の2番目のレコードから読み込みを開始して、オブザベーションを作成します。INPUTステートメントに指定されている数のレコードを読み込みます。
  5. LOSTCARDのIF条件が真である場合、ステップ1から4を繰り返します。ログを見やすくするため、指定したレコードグループに対してメッセージとルーラーが出力されるのは1度だけです。また、レコードが、次のオブザベーションの作成で使用される場合でも1度しか出力されません。
  6. LOSTCARDのIF条件が真でない場合、オブザベーションが作成され、SASデータセットに書き込まれます。

例: 入力データの再同期

この例では、条件付きの作成にLOSTCARDステートメントを使用して、欠損データの特定と入力データの再同期を実行します。
data inspect;
   input id 1-3 age 8-9 #2 id2 1-3 loc 
         #3 id3 1-3 wt;
   if id ne id2 or id ne id3 then
    do;
      put 'DATA RECORD ERROR: ' id= id2= id3=;
      lostcard;
    end;
   datalines;
301    32
301    61432
301    127
302    61
302    83171
400    46
409    23145
400    197
411    53
411    99551
411    139
;
このDATAステップでは、オブザベーションを書き込む前に入力レコードを3つ読み込みます。レコード1(変数ID)のID番号が2番目のレコード(ID2)または3番目のレコード(ID3)と一致しない場合、レコードが正しく入力されていないか欠損しています。IF-THEN DOステートメントでは、ID番号が無効な場合にPUTステートメントに指定したメッセージを出力し、LOSTCARDステートメントを実行するように指定しています。
この例では、2番目のオブザベーション(ID3=400)の3番目のレコードが欠損しています。3番目のオブザベーションの2番目のレコードが誤って入力されています(ID=400となるのが正しいですが、ID2=409となっています)。そのため、データセットにはID301とID411の2つのオブザベーションが含まれます。ID=302またはID=400のオブザベーションはデータセットに含まれません。このDATAステップを実行すると、PUTステートメントとLOSTCARDステートメントにより、次のステートメントがログに書き込まれます。
DATA RECORD ERROR:id=302 id2=302 id3=400 NOTE:LOST CARD.RULE:----+----1----+----2----+----3----+----4----+----5----+---- 14   302    61 15   302    83171 16   400    46 DATA RECORD ERROR: id=302 id2=400 id3=409 NOTE:LOST CARD.17   409    23145 DATA RECORD ERROR: id=400 id2=409 id3=400 NOTE:LOST CARD.18   400    197 DATA RECORD ERROR: id=409 id2=400 id3=411 NOTE:LOST CARD.19   411    53 DATA RECORD ERROR: id=400 id2=411 id3=411 NOTE:LOST CARD.20   411    99551
番号14、15、16、17、18、19、20はSASログ内の行番号を示しています。

関連項目:

ステートメント:
前のページ|次のページ|ページの先頭へ