* HASH 테이블에서 동일한 키 값을 가지는 다중 항목 검색하기;
* 원문 : Sample 24641: Find multiple items in a hash table that have the same key;
* 사이트 : http://support.sas.com/kb/24/641.html;
********************************************************************;
/* METHOD 1 */
********************************************************************;
/* 첫 번째 Method는 hash 반복기(iterator)를 사용하여서 첫 번째 키 값이 동일한(두 번째 키 값은 체크 안 함) 모든 항목을 hash object에서 검색한다.
반복기 오브젝트를 사용하여서 전체 hash 테이블을 처리.;
이 Method는 중복 키값을 허용하지 않은 SAS 9.1 버젼에서 처리하는 방식(SAS 9.2 이상에서는 중복 키값 처리 가능).
원하는 키 값을 검색하기 위하여 반복기(iterator) 오브젝트를 사용하여서 전체 hash 테이블을 읽어야 한다.*/
data work.sales;
input prod $1-5 size qty $10-15;
datalines;
tie 10 39007
tie 11 398487
shirt 20 384223
pants 30 329559
pants 31 329559
;
data tie1;
/* DATA 스텝의 첫 번째 반복 작업을 수행하면서, HASH object H를 선언하고, WORK.SALES 데이터를 로드한다.
ORDERED: 인수 태그는 데이터 값이 내림차순으로 정렬하여 로드되도록 처리한다.
hash table에서 중복 키값을 허용하지 않기 때문에, PROD와 SIZE 양쪽 변수를 키 값 변수로 정의한다.
기본적으로 키 변수는 출력되지 않기 때문에, 키 값을 출력하기 위하여 QTY 변수와 함께 defineData에 정의한다.
로그에 "변수 'prod'이(가) 초기화되지 않았습니다." 메시지 출력을 방지하기 위하여,
데이터 세트 변수 prod, qty 와 size 변수를 결측치 값으로 초기화
*/
if _N_ = 1 then do;
length prod $10 qty $6 size 8;
declare hash h(dataset: 'work.sales', ordered: 'yes');
declare hiter iter('h'); * HASH 반복기 ITER 선언;
/* Define key and data variables */
h.defineKey('prod', 'size');
h.defineData('qty','prod','size');
h.defineDone();
call missing(prod,qty,size);
end;
/* 현재 첫 번째 키 값을 기준으로 처리하기 원하기 때문에, Hash 오브젝트를 반복하여 처리하는 반복기(iterator)를 사용하여서
첫 번째 키 값이 PROD='tie'인 모든 데이터 값을 출력한다. */
rc = iter.first();
do while (rc = 0);
if prod='tie' then output;
rc = iter.next();
end;
run;
proc print;
run;
********************************************************************;
/* METHOD 2 */
********************************************************************;
/* 두 번째 Method는 원하는 키 값을 검색하기 위하여 SAS 9.2에서 제공하는 새로운 방식으로 키 값에 대하여 중복 데이터 항목을 처리할 수 있다.
이 방식은 hash 검색기(iterator) object 대신에 사용자가 지정한 키 값과 일치하는 행만을 처리할 수 있다. */
data work.sales;
input prod $1-5 size qty $10-15;
datalines;
tie 10 39007
tie 11 398487
shirt 20 384223
pants 30 329559
pants 31 329559
;
data tie2;
/* DATA 스텝의 첫 번째 반복 작업을 수행하면서, HASH object H를 선언하고, WORK.SALES 데이터를 로드한다.
ORDERED: 인수 태그는 데이터 값이 내림차순으로 정렬하여 로드되도록 처리한다. HASH 반복기 ITER를 선언한다.
multidata: 인수 태그를 지정하여서 hash 테이블에서 중복 키값을 사용할 수 있으므로 PROD 변수만을 키 변수로 정의한다.
기본적으로 키 변수는 출력되지 않기 때문에, 키 값을 출력하기 위하여 QTY 변수와 함께 키 변수를 defineData에 정의한다. */
if _N_ = 1 then do;
if 0 then set work.sales;
declare hash h(dataset: 'work.sales', ordered: 'yes', multidata:'Y');
/* 키 값과 출력 변수를 지정 */
/* multidata 인수 태그를 지정하였기 때문에 하나의 키(prod)만을 지정한다 */
h.defineKey('prod' );
h.defineData('prod','size','qty');
h.defineDone();
end;
/* FIND() method는 키 값에 해당하는 값을 검색한다.
has_next 매소드를 사용하여서 키 값을 기준으로 여러 데이터 값이 존재하는지 확인할 수 있다. */
rc = h.find(key:'tie');
if rc = 0 then do;
output;
rc2 = h.has_next(RESULT:R);
do while (R ne 0);
rc = h.find_next();
output;
rc2 = h.has_next(RESULT:R);
end;
end;
keep prod size qty;
run;
proc print;
run;
***********************************************************
- 통계분석연구회
- 카페 : http://cafe.daum.net/statsas
- 통계분석연구회 페이지 : https://www.facebook.com/statsas
- 통계분석연구회(Statistics Analysis Study) 그룹 :https://www.facebook.com/groups/statsas/
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!