「WHERE」と「サブセット化IF」の違いを知って使い分けようっていう話です。
Sample data
data test;
length col1-col200 $200.; array ar(*) col:; do i=1 to dim(ar); ar(i) = "abcdefg"; end; do i=1 to 50000; output; end; run; |
サンプルデータから「WHEREステートメント」を使ってオブザベーションを抽出したときの処理時間とCPU時間を見てみます。
data out1;
set test; where i<100; run; ログ 処理時間 0.40 秒 CPU時間 0.39 秒 |
同様のオブザベーションの抽出を「サブセット化IF」を使って処理時間とCPU時間を見てみます。
data out1;
set test; if i<100; run; 処理時間 0.53 秒 CPU時間 0.54 秒 |
WHEREステートメントの方が処理時間が短いですね。何故このような違いが起きたのでしょうか。
・実行されるタイミングが違う
WHERE | データを読み込む時に実行される |
サブセット化IF | データを読み込んだ後のデータステップ内で実行される |
WHEREの方が実行されるタイミングが早いんで、処理時間が短くなるというわけですね。
・実行できる環境の違い
WHERE | データステップおよび(ほとんどの)PROCステップで実行できる |
サブセット化IF | データステップでのみ実行できる |
サブセット化IFが効果的な例として、以下のサブセット化IFについての記事の例②で紹介しているようなケースです。
【サブセット化IF】条件に一致するオブザベーションのみ処理を継続する。
data out2;
set dt1; bmi = weight / ((height/100)**2); if bmi>=25; run; |
身長と体重からBMIを計算したあと、「if bmi>=25」でBMIが25以上のオブザベーションを残すようにしていますが、
このBMIはデータステップ内で計算しているので、「where bmi>=25」と書くことは出来ませんよね(データを読み込む時には、まだBMIが計算されていないので)
0 件のコメント:
コメントを投稿