* 제목 : 문자열이 다양한 길이로 존재하거나 또는 와일드카드(wildcards)를 포함하는 경우에 대상 문자열과 가장 유사한 값을 선택하는 방법;
* Sample 25977: Determine the closest match for a target string when values of varying lengths, or values containing wildcards;
* 출처 : http://support.sas.com/kb/25/977.html;
* 목적 : 문자열의 끝에 와일드카드가 존재하여서 다양한 길이의 관측값이 존재하는 두 번째 테이블(Source)에서 특정 문자열을 기준으로 효율적으로 테이블 검색 작업을 수행한다.;
* 참고 : 와일드-카드wild card;
/* <컴퓨터> 운영 체제 명령어에서 파일의 이름을 지정할 때에, 여러 파일을 한꺼번에 지정할 목적으로 사용하는 기호.
예를 들어 ‘*’는 임의의 문자열을 나타내고, ‘?’는 임의의 한 문자를 나타낸다. */
data source;
input x $ y $;
datalines;
12345678 xyz
123456** abc
12345*** efg
1234**** hij
;
PROC SORT DATA=SOURCE OUT=TEST;
BY DESCENDING X;
RUN;
/* 조회 작업을 수행할 데이터 세트 생성.
SOURCE 데이터 세트에서 여러 개의 값 중에서 가장 유사한 값을 최적으로 검색하여서 해당 관측치의 Y의 값을 획득한다. */
data target;
input x $ ;
datalines;
12345678
12345601
12345602
12345001
12345002
12340001
12340002
11111111
12340003
;
data out;
length x y $ 8;
/* 데이터 스텝의 첫 번째 반복 작업에서 Hash 테이블 H를 생성하고 인스턴트화 한다.
DATASET: 인수 태그를 사용하여서 WORK.SOURCE 데이터 세트를 Hash 테이블 H에 로딩한다.
HASH 테이블 검색을 위하여 DEFINEKEY 매소드를 사용하여서 x 변수를 조회 키 변수로 정의한다.
HASH 객체에 사용자가 지정한 내림차순 방식으로 x변수를 로드하기 위하여 ORDERED: 인수를 사용한다.
정렬 방식을 내림차순으로 지정하는 것은 SOURCE 데이터 세트의 값 중에서 가장 유사한 값을 선택하기 위한 프로그램의 핵심 기법이다.
DEFINEDATA 매소드를 사용하여서 키와 연관된 값으로 X,Y 변수를 데이터 항목으로 정의한다.
HASH 반복기(Iterator) 이름을 h_iter로 선언한다.
HASH 반복기는 HASH 객체에서 개별 키 값을 기준으로 반복 작업을 수행한다. */
if _n_=1 then do;
declare hash h(dataset:'source', ordered:'descending');
h.definekey('x');
h.definedata('x','y');
declare hiter h_iter('h');
h.definedone();
call missing(x, y);
end;
/* HASH 오브젝트에서 데이터 값이 반환 될 때, 반환되는 X변수의 값이 TARGET 데이터 세트의 X 변수의 값을
변경하지 않도록 TARGET 데이터 세트의 X 변수의 이름을 TX로 변경한다. */
set target(rename=(x=tx));
rc=h_iter.first();
do while (rc=0);
if substr(tx,1,length(compress(x,'*')))=compress(x,'*') then leave;
/* 문자열에서 '와일드 카드'를 제외한 문자열의 길이를 기준으로 비교 작업을 수행하여서 일치하지 않는 경우
다음으로 가장 일치하는 값을 검색하기 위하여 다음 키 값을 기준으로 위의 비교 작업을 반복하여서 수행한다. */
rc1=h_iter.next();
/* 일치하는 값을 찾지 못하여서 반복 작업을 수행하기 위한 KEY 값이 더 이상 존재안하는 경우 Y 변수의 값을 'not' 으로 저장하고,
해당 관측치에 대한 처리 작업을 중지한다. */
if rc1 ne 0 then do;
y='not';
leave;
end;
end;
run;
proc print;
run;
**********************************************************
- 통계분석연구회
- 카페 : http://cafe.daum.net/statsas
- 통계분석연구회 페이지 : https://www.facebook.com/statsas
- 통계분석연구회(Statistics Analysis Study) 그룹 :https://www.facebook.com/groups/statsas/
#통계 #빅데이터 #통계분석연구회