データセットのオブザベーション数を数える時に、nobs=を使って取得することができますが
http://sas-tumesas.blogspot.jp/2013/10/sascall-symput.html
それと同じ感じで、「num_items」というキーワードを使ってハッシュオブジェクト内の
オブザベーション数(レコード数といった方がいいのか?)を取得できます。
また今まで、addでハッシュオブジェクトにレコードを追加する方法ばかりやってきましたが、
当然逆もできて、レコードを全部消すことも、1つ消すこともできます。
では、とりあえずコードを見ていきましょう
data Q2;
X=1;Y='A';Z='い';output;
X=2;Y='A';Z='ろ';output;
X=2;Y='B';Z='は';output;
run;
data A1;
if _N_=0 then set Q2;
declare hash hq1(dataset:'Q2');
hq1.definekey('X','Y');
hq1.definedata('Z');
hq1.definedone();
N1= hq1.num_items;
hq1.clear();
N2=hq1.num_items;
hq1.add(key:9,key:'A',data:'い');
hq1.add(key:8,key:'B',data:'い');
N3=hq1.num_items;
hq1.remove(key:9,key:'A');
N4=hq1.num_items;
output;
stop;
keep N:;
run;
結果は、
はい、まずN1= hq1.num_items;で,値は3になっています。
ハッシュオブジェクト名.num_itemsでハッシュオブジェクトのレコード数を取得できます。
Q2のオブザベーション数が3だったので、それを入れたハッシュオブジェクトhq1のレコード数が
3になるのは必然ですね。
次にhq1.clear();としていますが、これはclearメソッドで、ハッシュオブジェクトのレコードを空にします。要注意!!なのは、ハッシュオブジェクトの定義自体は存在するということです。空だけど箱はある状態です。
deleteメソッドというのがあって、それと間違いがちなのですが、deleteメソッドはハッシュオブジェクトの存在ごと消し去ってしまいます。元々ハッシュオブジェクトは、1回のデータステップが終了した時点で消滅するので、deleteメソッドを使うケースは、相当レアです。
つまり、1回のステップ中に同名で、定義の違うハッシュオブジェクトを作成してそれを絡ませた特殊な処理をやりたいようなケースです。
N2= hq1.num_items;で,値は0になっています。直前でclearメソッドされているので、空になったいうことです。
その後、addメソッドで2レコード追加されたためN3は2です。
hq1.remove(key:9,key:'A');としていますが、これはremoveメソッドで、指定したkeyを持つレコードをハッシュオブジェクトから取り除きます。
そのためN4は1です。
いかがでしょうか?ハッシュの感覚がつかめてきたでしょうか??
0 件のコメント:
コメントを投稿