ラベル ステートメント: DROP の投稿を表示しています。 すべての投稿を表示
ラベル ステートメント: DROP の投稿を表示しています。 すべての投稿を表示

2018年8月30日木曜日

【効率を意識したプログラム】KEEPやDROPの利用




DROPとKEEPを活用しようっていう話です。



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;


上記、変数を沢山持つ50000obsのデータセットを作りました。



このデータセットを以下のようにSETした時の処理時間とCPU時間を見てみます。

data out1;
   set test;
run;

ログ
       処理時間           1.95 秒
       ユーザーCPU時間    0.32 秒
       システムCPU時間    1.64 秒



ここで例えば変数col1~col10だけが必要な変数だったとしたら、、

data out1;
   set test (keep=col1-col10);
run;

ログ
       処理時間           0.85 秒
       ユーザーCPU時間    0.03 秒
       システムCPU時間    0.83 秒


SETする時にKEEPやDROPで読み込む変数を絞っておくと、処理時間などが少し短くなります。





また、データステップ中に作成した一時変数や、使わなくなった変数は出力データセットから除いておくと、、

data out1;
   set test ;
   drop col1-col10;
run;


または

data out1 (drop=col1-col10);
   set test ;
run;

サイズが軽量化されて、その後このデータセットを読み込む時の処理時間なども短くなる事が期待できますよね。




このように効率を意識しながら、KEEP・DROPを指定する場所を使い分ける事がポイントです。

まぁ軽いデータだったり、実行に時間がかからないプログラムだったら、ここまで意識してKEEP・DROPを使わなくてもいいと思います。(多用しまくるとプログラムがごちゃっとした見た目になりがちだし)



【DROP・KEEPステートメント】データセットから特定の変数を削除または残す



2016年7月12日火曜日

【RENAMEステートメント】変数名の変更



※ データステップのMODIFYステートメントなど、特定の機能を用いるとRENAMEステートメントが動作しないことがあるので注意。



以下の構文で変数名を変更することができます。



構文

RENAME
        変更前の変数名1 = 変更後の変数名1
        変更前の変数名2 = 変更後の変数名2
        ・・・
 ;

💬 
  • 通常のステートメントはPDVという「一時的な処理スペース」で実行されますが、RENAMEステートメントは「一時的な処理スペース」の結果を「出力データセットへ書き込む時」に実行します
  • つまり、最終的に適用されるイメージです。また適用されるタイミングが決まっているので、RENAMEステートメントを記述する位置は関係ありません(プログラムの先頭や最後に書いても挙動は変わらない)






data DT2;
   set SASHELP.CLASS;
   rename AGE=AGE2;
run;

変数AGE を AGE2に変更しています。




注意点

RENAMEステートメントを DROP、KEEPステートメントと併用して使う場合、以下のルールを理解しておいた方が良いです。


【ルール】
ステートメントの実行順は、DROP → KEEP → RENAME


このルールに従うと、以下のプログラムは正しく動かない事が分かると思います。

data DT2;
  set SASHELP.CLASS;
  rename AGE=AGE2;
  drop AGE2;
run;

2016年6月22日水曜日

【DROP・KEEPステートメント】データセットから特定の変数を削除または残す




※ データステップのMODIFYステートメントなど、特定の機能を用いるとDROP, KEEPステートメントが動作しないことがあるので注意。




DROPステートメント

指定した変数を出力データセットに「含めない」ようにする

data DT2;
   set SASHELP.CLASS;
   drop NAME AGE;
run;

💬 
  • 通常のステートメントはPDVという「一時的な処理スペース」で実行されますが、DROPステートメントは「一時的な処理スペース」の結果を「出力データセットへ書き込む時」に実行します
  • つまり、最終的に適用されるイメージです。また適用されるタイミングが決まっているので、DROPステートメントを記述する位置は関係ありません(プログラムの先頭や最後に書いても挙動は変わらない)




KEEPステートメント

指定した変数のみ」出力データセットに「含める」ようにする

data DT1;
   set SASHELP.CLASS;
   keep NAME AGE;
run;

💬 
  • DROPステートメントと同様、KEEPステートメントは記述する位置に関係なく、「出力データセットへ書き込む時」に実行します(詳細は上のDROPステートメントの説明を参照)




テクニック

過去にいくつかテクニックを紹介しています。

ATTRIBとKEEPを使った基本コンボ
変数名をいっきに指定する方法 [まとめ]



また、上の2つ目のリンク記事内にある「:(コロン)」を使ったよくやるテクニックを紹介。

やりたい事
「データステップ内で作った一時的な変数を最終的にまとめてDROPしたい」


こういった場合、まとめてDROPしたい変数の名前の先頭に 「tmp_」 とかつけておいて、「DROP tmp_: ;」 と書いてしまえば、最後に「tmp_○○」の変数をまとめて削除できちゃいます。
(たまにやっちゃうミスですが、既存の消したくない変数に「tmp_○○」というのがあったらそれも消えちゃうので気をつけてください)



data DT3;
   set SASHELP.CLASS;
   _A = 1;
   _B = 2;
   drop _: ;
run;


上の例では先頭に「_」のつく変数をまとめて削除しています。