* 데이터 세트의 관측치를 기준으로 Hash 테이블 생성과 데이터 로드;
* Sample 25989: Create and load a hash table for each observation read from a data set;
* 출처 : http://support.sas.com/kb/25/989.html;
* 목적 : DECLARE, _NEW_, DELETE 매소드를 사용하여서, 데이터 세트의 관측치를 기준으로 HASH 테이블 생성과 로드 작업을 수행한다.
* 조회(LOOKUP) 데이터 세트의 이름으로 구성된 K1 변수를 포함하는 데이터 세트 생성.
* D1의 관측치 값은 조회 테이블의 키 변수 K2와 동일하다.;
data list;
input k1 $ d1;
datalines;
mon 2
thurs 4
;
proc print data=list;
title 'List';
run;
/* 조회(lookup) 데이터 세트 생성 */
data mon;
do k2=1 to 3;
d2=k2+1;
output;
end;
run;
proc print data=mon;
title 'Mon';
run;
data tues;
do k2=1 to 2;
d2=k2*2;
output;
end;
run;
proc print data=tues;
title 'Tues';
run;
data thurs;
do k2=1 to 4;
d2=k2**2;
output;
end;
run;
proc print data=thurs;
title 'Thurs';
run;
/* 첫 번째 반복 작업에서 LIST 데이터 세트의 첫 번째 관측치(k1=mon)를 기준으로,
mon 데이터 세트를 기준으로 HASH 테이블을 구성하고, d1의 값(2)을 k2 변수에 할당하여서
HASH 테이블에서 k2의 값이 2인 데이터 항목(k2=2, d2=3)을 반환한다.
두 번째 반복 작업에서 LIST 데이터 세트의 두 번째 관측치(k1=thurs)를 기준으로,
thurs 데이터 세트를 사용하여서 HASH 테이블을 구성하고, d1의 값(4)을 k2 변수에 할당하여서
HASH 테이블에서 k2의 값이 4인 데이터 항목(k2=4, d2=16)을 반환한다.
*/
data final;
/* 데이터 스텝의 첫 번째 반복 작업을 수행하면서, HASH object H2를 선언한다.*/
if _n_=1 then do;
declare hash h2;
end;
set list;
/* HASH 오브젝트 H2에서 정의된 모든 변수의 LENGTH를 지정한다. */
length k2 d2 8;
/* _NEW_ 매소드를 사용하여서 HASH 테이블 H2를 인스턴스화 한다.
DATASET: 인수 테그는 WORK.LIST 데이터 세트의 K1 변수의 값에 따라 해당 데이터 세트를 H2 HASH 테이블에 로드한다.
K2 변수를 조회 키(Lookup Key)로 정의한다. K2와 D2 변수를 K2 키와 연관된 데이터로 정의한다.
K2를 DEFINEKEY 와 DEFINEDATA 매소드 양쪽에 지정하여서 K2 변수를 출력 데이터 세트에 출력한다. */
/* [참고] http://www.terms.co.kr/instance.htm
인스턴스는 추상화 개념 또는 클래스 객체, 컴퓨터 프로세스 등과 같은 템플릿이 실제 구현된 것이다.
인스턴스화는 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음,
그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해, 인스턴스를 만드는 것을 의미한다.
*/
h2 = _new_ hash(dataset:k1);
h2.defineKey ('k2');
h2.definedata('k2','d2');
h2.defineDone ();
/* 로그에 "지정된 변수가 초기화되지 않았습니다." 메시지 출력을 방지하기 위하여,
데이터 세트 변수 K2 와 D2 변수를 결측치 값으로 초기화한다. */
call missing(k2, d2);
/* NOBS 변수에 조회 데이터 세트의 전체 관측치 개수를 저장한다. */
nobs=h2.num_items;
/* K2 변수에 D1의 값을 할당하여서 FIND 매소드의 실행을 통하여 HASH 테이블 H2에서
적합한 D2의 데이터 항목이 반환될 것이다. */
k2=d1;
rc=h2.find();
/* 데이터 스텝의 다음 반복 작업에서 새로운 HASH 테이블을 생성하기 위하여
현재 작업에서 사용하였던 HASH 테이블 H2를 삭제한다. */
rc=h2.delete();
run;
proc print data=final;
title 'Final';
run;
***********************************************************
- 통계분석연구회
- 카페 : http://cafe.daum.net/statsas
- 통계분석연구회 페이지 : https://www.facebook.com/statsas
- 통계분석연구회(Statistics Analysis Study) 그룹 :https://www.facebook.com/groups/statsas/
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.