data Q3;
X=3;Y='C';output;
X=1;Y='A';output;
X=2;Y='B';output;
run;
というデータセットがあって
以下のコードを実行します。
data _NULL_;
if _N_=0 then set Q3;
declare hash hq1(dataset:'Q3');
hq1.definekey('X');
hq1.definedata('Y');
hq1.definedone();
hq1.replace(key:3,data:'D');
hq1.output(dataset:'A1');
stop;
run;
すると A1というデータセットが作成され、中身は
です。
outputメソッドはハッシュオブジェクトのdataを指定した名前でデータセットにしてくれます。
outputされる際のオブザベーションの並び順はランダムです。
で、当然、dataだけじゃなくてkeyも欲しいとなるかもしれませんが、今のところ僕が知っているのは
以下のような方法だけです。
data _NULL_;
if _N_=0 then set Q3;
declare hash hq1(dataset:'Q3');
hq1.definekey('X');
hq1.definedata('X','Y');
hq1.definedone();
hq1.replace(key:3,data:3,data:'D');
hq1.output(dataset:'A1');
stop;
run;
data _NULL_;
if _N_=0 then set Q3;
declare hash hq1(dataset:'Q3');
hq1.definekey('X');
hq1.definedata('X','Y');
hq1.definedone();
hq1.replace(key:3,data:3,data:'D');
hq1.output(dataset:'A1');
stop;
run;
keyで指定した変数をdataにも指定できるというわけです。
さて、outputされる際のオブザベーションの並び順にソートをかけるのはorderedというものを使います。
proc sort data=Q3 out=A2;
by X;
run;
と同じことをハッシュでやる場合
data _NULL_;
if _N_=0 then set Q3;
declare hash hq1(dataset:'Q3',ordered:'a');
hq1.definekey('X');
hq1.definedata('X','Y');
hq1.definedone();
hq1.output(dataset:'A2');
stop;
run;
でできます。
ordered:'a' のaはascendingのa、要は昇順ですね。ordered:'y' ordered:'yes'でも昇順になります。
逆にordered:'d'なら降順になります。
Keyに指定している値で順にソートされます。
この一度、データセットをハッシュオブジェクトに入れてソートして、データセットに吐きだす方法、データセットの大きさや、ハードの性能など状況によっては結構効率いいという噂を聞きますが、実証していません。
まあ正直、やりたいことがソートだけならわざわざハッシュ使いませんよね、めんどい。
0 件のコメント:
コメントを投稿