SASにおけるインデックスの話_まずはindexを作成する

SASデータセットにつける索引機能 インデックスの話です。index関数の話ではありません。
SASの処理速度が高速なことと、SASでは、データセットを新規に作成して処理を進めていくことが多いので、新規データセットを普通に作ると消えてしまうインデックス(modifyを使えば消さずに更新できる)は、それほど使われていない気がします。

僕もDB畑でのプログラム経験はなく、実行時に、使用されるかされないかわからない曖昧なインデックスについては、なんか、どう使っていいのかわからないものとしか思っていませんでした。

ただ、プログラムの幅を広げようとインデックスにも手をだしてみたところ、なかなか面白くて、また世界が少し広くなりました。
何が面白いかというと、SQLやハッシュオブジェクト、あるいはpoint=オプションの面白さにも通じますが、SASの1オブザベーション目から最終まで順番にという基本的な方針、シーケンシャルアクセスに逆らうことができるところでしょうか?1つ1つ値を読んで判断するのではなく、インデックスをみて、ダイレクトにそのobsを処理するみたいな。

まだ初歩的なことしかできませんが、少しずつ紹介します。
間違ったことを書いてしまったらご指摘ください。

まずはインデックスの作り方から。

適当なデータセットを作ります。

data Q1;
 do X=1 to 10;
  do Y='A','B','C';
   Z=cats(put(X,best.),Y);
    output;
  end;
 end;
run;


これから、このデータセットで
変数Zに対して単一インデックス「Z」を作成し
変数XとYを1組として複合インデックス「XY」を作る方法を3パターン紹介します。

単一インデックス「Z」にはインデックスが一意でなければいけないという制約と
欠損値であってはいけないという制約をつけます。

なお、単一インデックスはかならず、変数名と同じ名前のインデックスになります。
複合は自分で名前をつけられます。

では


【datasetsプロシジャを使う方法】

proc datasets nolist;
 modify Q1;
 index create Z/unique nomiss;
 index create XY=(X Y);
run;
quit;

を実行すると


となり、データセットのプロパティでインデックスのタブをみると



となっています。

ちなみに

proc datasets nolist;
 modify Q1;
 index delete Z XY;
run;
quit;

で消せます。

【SQLプロシジャを使う方法】
データベース操作に慣れた方であればSQLでかかれることが多いと思います

proc sql;
 create unique index Z on Q1;
 create index XY on Q1(X,Y);
quit;

で作れます。

要注意なのは、SQLプロシジャでは非欠損値制約 nomissが使えないことです(多分)

proc sql;
 drop index Z,XY from Q1;
quit;

で消せます。

【データセットオプションで作成】

data A1(index=(Z/nomiss/unique XY=(X Y)));
 set Q1;
run;

この方法はお勧めです。データセット作るついでにつけることができるので。








0 件のコメント:

コメントを投稿