DO_OVERメソッド

DO_OVERメソッド

 重複キー内のデータを検索する際に使用します。

ハッシュオブジェクトではBYグループ集計ができないため、DO_OVERメソッドを使用することで同等の処理を実現することが可能です。

 

サンプル1:

data dup;
length key data 8;
input key data;
datalines;
1 10
1 15
2 16
2 9
3 10
3 101
3 102
;
run;

data _null_;
length r 8;
call missing (r,data,key);
dcl hash h(dataset:'dup', multidata: 'y', ordered: 'y');
h.definekey('key');
h.definedata('key', 'data');
h.definedone();

h.reset_dup();
do while(h.do_over(key:2) eq 0);
put key= data=;
end;

run;

 

 ただし、ソートされていない連続するキーでキーが頻繁に入れ替わる状況ではDO_OVERメソッドはキーの入れ替えを行ないません。このような場合はRESETDUPメソッドを使用します。

 

サンプル 

data dup;
input key_id value;
datalines;
1 10
2 11
1 15
3 20
2 16
2 9
3 100
5 5
1 5
4 6
5 99
;
run;

data dup_test;
dcl hash h(dataset:'dup', multidata: 'y', ordered: 'y');
h.definekey('key_id');
h.definedata('key_id', 'value');
h.definedone();

*1
dcl hash hunq(dataset:'dup', ordered: 'y');
hunq.definekey('key_id');  
hunq.definedata('key_id');
hunq.definedone();

call missing(key_id, value);
declare hiter hi("h");
declare hiter hunqi("hunq");

rc=hunqi.first();
/* summation by group */
do while(rc=0);
h.reset_dup();
_value=0;
do while(h.do_over(key:key_id) eq 0);
_value+value;
output;
end;
rc=hunqi.next();
end;
run;

 

上記のサンプルではあらかじめ重複キーのデータを一意のデータに加工してdo_overで集計しています。個人的にはこの使用方法がベストだと考えています。

 

*1:ハッシュイテレータでループしてDO_OVER、RESET_DUPが使用できるように一意キーの設定をします

Hash Object SUMINCについて

SASのSUMINCメソッドについて紹介します。

がその前にハッシュオブジェクトの概要を説明します。

 

  • ハッシュオブジェクトとは

 SASのHash Objectはプログラム実行時にデータセットをメモリに格納し、キー、データの単位でテーブルルックアップを実行するオブジェクトになります。

 

ARRAYステートメントなどのコンパイルステートメントコンパイル時に指定された単位で作成されるため、データは固定的です。

 

Hash objectはSASプログラム実行時に実装され、かつ処理内容によってデータのサイズが変化します。そのため、データステップと組み合わせることで大量データのルックアップの検索効率が大幅に改善されることが期待されます。

  • SUMINCメソッド

Hash objectのsumincメソッドを使用するとdata stepではグループ集計、マージの際に事前にソートが必要になっていた面倒な処理がhash objectを使用することで処理が一回で済みます。

 

例:Hash objectでグループ集計+ソート

data hashdup;
    input id data;
    datalines;
3 100
1 10
1 15
2 16
2 9
1 5
;
run;

/* ハッシュオブジェクト例(ソート集計) */
data _null_;
    length id data suminc 8;

    if _N_=1 then
        do;
            call missing(id, data, suminc);
            dcl hash h(ordered:"yes", multidata:"yes", suminc:"suminc");
            h.definekey("id");
            h.definedata("id", "data", "suminc");
            h.definedone();
            dcl hiter hi("h");
        end;

    do until(last.eof);
        set work.hashdup end=eof;
        by id notsorted;
        suminc=data;
/*      check and add */
        h.ref();
/*      summate */
        h.sum(sum:suminc);
/*      replace whole obs */
        h.replace();
/*      output; */
        if eof then h.output(dataset:"work._hashdup(drop=data)");
    end;
run;

SAS Certified Professionalの情報

 公式テキスト

SASから英語版でテキストが出版されています。

https://www.amazon.co.jp/SAS-Certified-Professional-Prep-Guide/dp/1642954675

 

 SAS関連サイト

すべて英語です。

SAS Institute Japanから関連情報も出ているようですが、前バージョンのSAS9の情報のみですので原則的にSAS本社のサイトをチェックしましょう。

これから試験の準備をすることを考えている方は以下の試験概要URL、試験前の準備についてよく確認することをお勧めします。

 

試験概要:

www.sas.com

認定前提条件としてBase SAS Programmer for SAS 9か、SAS Certified Specialist: Base Programming Using SAS 9.4を取得している必要があります。

 

以下のサイトでは実際の試験のラボ環境について動画で開設されてあります。

事前に入念にチェックしておくことで焦らずに受験することができます。

 

communities.sas.com

 

模擬試験

模擬試験が無料で提供されております。

前のバージョンはSAS Instisute Japanから有料で提供されていたようですが、9.4のperformance baseの模擬試験は無料です。

本試験よりは易しめです。試験を受ける際のPC環境など重要なポイントが掲載されております。これから受ける方は公式テキストを2、3周した後に↓の模擬試験を4,5周されるとよいでしょう。

vle.sas.com

 

実際の試験について

 

  SAS Certified Professional: Advanced Programming Using SAS 9.4 certificationは選択式の問題に加えて、実際にSASのコードを書く問題が出題されます。

 

コードの問題が12問、選択問題が18問で合わせて30問でと少ないのですが、SASコードの問題で詰まるとあっという間に時間がとられますので、個人的には30問でも多いと感じました。

私は1問最大10分の感覚で回答し、わからない問題はチェックをつけて後からレビューをする形式で進めましたが、見直しも含めて制限時間の2時間30分を使い切りました。

 

試験の感想としては個々の問題はコードも含めてそれほど難しくはありません。

しかし、公式テキストに掲載されている内容を前提とした応用問題が出題されますので、SASSQL、マクロ、HASHオブジェクトなどのコードがスクラッチで書けるようにSAS University Edition、SAS onDemandの無料でSASを使用できる環境で慣れ親しんでおくとよいでしょう。