ラベル OBS= の投稿を表示しています。 すべての投稿を表示
ラベル OBS= の投稿を表示しています。 すべての投稿を表示

2018年11月22日木曜日

FIRSTOBS=, OBS=, WHERE を組み合わせたときの挙動




データセットオプション「FIRSTOBS=」と「OBS=」の紹介と、WHEREステートメントを組み合わせて使用した時の挙動について、まとめておきます。



データの状態によっては結果がバグる事があって、その辺の注意点については最後に別記事のリンク貼ってるので参照下さい。



Sample data
data a;
   do i=1 to 10;
     output;
   end;
run;





FIRSTOBS=オプション

・処理(読込み)を開始するオブザベーションを指定できます。

proc print data=a (firstobs=3);
run;




OBS=オプション

・何オブザベーション目まで処理するか(読み込むか)を指定できます。

proc print data=a (obs=3);
run;




FIRSTOBS=, OBS=, WHERE の組み合わせ

ここから本題。以下のプログラムで結果が予測できればバッチリです。

proc print data=a (firstobs=2 obs=3);
  where i>5;
run;


解説
・まずWHEREでオブザベーションを抽出。
・抽出したオブザベーションに対して、FIRSTOBS=とOBS=を適用。
・FISTOBS=とOBS=で共通する範囲にあるオブザベーションが処理対象となる。


以下にイメージを載せておきます。


ちなみに

SETステートメントとかでもこれらのオプションが使えます。

data b;
  set a (obs=3);
run;



注意


以下の記事で、FISTOBS=オプション自体の落とし穴も紹介しています。
FIRSTOBSオプションの落とし穴




2016年4月18日月曜日

0オブザベーションのデータセットを作る方法 【まとめ】


変数属性だけ定義した0オブザベーションのデータセットを作る方法をまとめてみます。


①STOP
data DT1;
    set SASHELP.CLASS;
    stop;
run;

STOPステートメントでオブザベーションが出来る前に処理を停止させてしまう。


② OBS=
data DT2;
    set SASHELP.CLASS (obs=0);
run;

OBS=オプションで読み込むオブザベーション数を指定できます。


③ IF 0
data DT3;
    if 0 then set SASHELP.CLASS;
    stop;
run;

「if 0 then」 の 「0」 は 「false」 の意味になり、then以降の 「set SASHELP.CLASS」 の部分は実行されません。
。。のはずですが、たとえ実行されなくてもデータセット名の指定があると、コンパイル時にそのデータセットの定義情報だけを読み込みにいきます。
①とほとんど同じ方法ですが、こちらの方が内部的に余計な処理が入らないのでスマートです。


④ SET _NULL_;
data DT4;
    set SASHELP.CLASS;
    set _null_;
run;

http://sas-boubi.blogspot.jp/2016/04/data-null.html
http://sas-tumesas.blogspot.jp/2013/10/1obs.html(データステップ100万回)

新手かも。


⑤ WHERE 0
data DT5;
    set SASHELP.CLASS;
    where 0;
run;

この方法も見かけた事ないかも。


⑥ SQL
proc sql;
    create table DT6 like SASHELP.CLASS;
quit;

http://sas-tumesas.blogspot.jp/2013/10/blog-post.html(データステップ100万回)