BookmarkSubscribeRSS Feed

[HASH Object] 데이터 세트의 개별 BY 그룹별로 Hash 테이블 생성하기

Started ‎06-12-2020 by
Modified ‎06-12-2020 by
Views 99

* 제목 : 데이터 세트의 개별 BY 그룹별로 Hash 테이블 생성하기; 

 

* Sample 25984 : Creating a hash table for each BY-Group of a data set;

 

* 출처 : http://support.sas.com/kb/25/984.html;

 

* 목적 :원본 데이터와 누적 데이터의 값을 유지하기 위하여 데이터 세트의 개별 BY 그룹별로 Hash 테이블을 생성한다. 

            이 예제는 DELETE() and REPLACE() 매소드 사용법을 설명한다.;

 

 

data in_data;

  input issue :$5. time :time8. price :comma12. qty;

datalines;

AA 9:31:01 $9.13 100

AA 9:31:25 $9.14 100

AA 9:32:00 $9.13 250

AA 9:34:00 $9.13 -100

BB 9:31:01 $9.13 100

BB 9:31:25 $9.14 100

BB 9:32:00 $9.13 250

BB 9:34:00 $9.13 -100

;

 

/* TIME_HASH의 값은 개별 BY 그룹에서 첫 번째로 발생하는 PRICE 변수에 대한 TIME의 값들을 유지한다.

     QTY_HAHS의 값은 개별 BY 그룹에서 동일한 PRICE 값을 가지는 관측치 별로 QTY의 값을 누적하여서 저장한다. */

 

data test;

     /* TEST 데이터 세트의 PDV을 구성하기 위하여 HAHS 오브젝트에 정의된 변수의 LENGTH 속성을 정의한다. */

 

      length time_hash qty_hash 8;

 

        /* 데이터 스텝의 첫 번째 반복 작업에서 Hash 테이블 H를 생성하고 인스턴트화 한다.

            HASH 객체에 price 변수의 데이터를 사용자가 지정한 올림차순 방식으로 정렬하여서 로드하기 위하여 ORDERED: 인수를 사용한다.

           PRICE 변수를 조회 키 변수로 정의하고, DEFINEDATA 매소드를 사용하여서 키와 연관된 값으로

           PRICE,TIME_HASH,QTY_HASH 변수를 데이터 항목으로 정의한다.

           TEST 데이터 세트에 PRICE 변수의 값을 출력하기 위하여 KEY와 DATA 양쪽 항목에 정의한다.

            SAS 로그에 "지정된 변수가 초기화되지 않았습니다." 메시지 출력을 방지하기 위하여,

            CALL MISSING 구문을 사용하여서 test 데이터 세트의 PDV에서 키 변수와 데이터 항목 변수를 결측치 값으로 초기화한다. 

            이 프로그래밍 단락에서는 HASH 테이블에 실제 데이터는 로딩하지 않는다. */

     if _n_=1 then do;

        declare hash h;

        h=_new_ hash(ordered:'yes');

        h.defineKey('price');

        h.defineData('price','time_hash','qty_hash');

        h.defineDone();

        call missing(time_hash, qty_hash);

     end;

 

     set in_data;

         by issue;

 

     /*  ISSUE 변수의 첫 번째 BY 그룹(AA)에 대한 작업 수행 후에 (두 번째 BY 그룹 이후-BB) 개별 BY 그룹의 첫 번째 관측치에 대한 

          데이터 스텝의 첫 번째 반복 작업을 실행하기 전에 현재 HASH 테이블을 삭제하고 동일한 속성의 HAHS 테이블을 생성한다. */

 

     if first.issue and _n_ ne 1 then do;

        /* 개별 ISSUE 변수의 값 별로 새로운 HAHS 테이블을 생성한다. */

        RX=h.delete();

        h=_new_ hash(ordered:'yes');

        h.defineKey('price');

        h.defineData('price','time_hash','qty_hash');

        h.defineDone();

     end;

 

     rc_find=h.find();

     if rc_find=0 then do;

        /* IN_DATA 테이터 세트에서 읽은 PRICE 변수의 값이 HAHS 테이블에 존재하면 RC값이 0 으로 반환되고, 현재 DO 구문에 대한 작업을 수행한다. 

           REPLACE 매소드를 사용하여서 HASH 테이블에서 QTY_HAHS의 값을 새로운 값으로 갱신(UPDATE)한다. */

        qty_hash=qty+qty_hash;

        rc_repl=h.replace();

 

        FIND=1;

     end;

     else do; 

        /* HAHS 테이블에서 동일한 PRICE 변수의 값을 찾을 수 없는 경우에 HAHS 테이블에 추가한다.

           개별 ISSUE 그룹의 첫 번째로 발생하는 PRICE 변수의 값들이 로딩되어서 HASH 테이블을 구성한다. */

        time_hash= time;

        qty_hash  = qty;

        rc_add    = h.add();

        NFIND=1;

     end;

 

     /* 데이타 스텝의 마지막 단계에서 실행되는 암묵적 출력(implied output) 프로세스가 TEST 데이터 세트에 관측치를 출력한다. */

run;

 

proc print;

     format time time_hash time8.;

run;

 

**********************************************************
- 통계분석연구회 
- 카페 : http://cafe.daum.net/statsas
- 통계분석연구회 페이지 : https://www.facebook.com/statsas
- 통계분석연구회(Statistics Analysis Study) 그룹 :https://www.facebook.com/groups/statsas/ 

 

#통계 #빅데이터 #통계분석연구회 

Version history
Last update:
‎06-12-2020 05:35 AM
Updated by:
Contributors

sas-innovate-white.png

🚨 Early Bird Rate Extended!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.

 

Lock in the best rate now before the price increases on April 1.

Register now!

Article Labels
Article Tags