* 제목 : 데이터 스텝 컴포넌트 객체를 사용하여서 퍼지(fuzzy) 결합 작업 수행.;
* Sample 24647: Perform a fuzzy merge using DATA step component objects;
* 출처 : http://support.sas.com/kb/24/647.html;
* 목적 : hash 반복기(iterator)를 사용하여서 HASH 객체에서 조회 변수의 값과 유사한 값을 검색한다.;
data one;
input time time5. sample;
datalines;
09:01 100
10:03 101
10:58 102
11:59 103
13:00 104
14:02 105
16:00 106
;
data two;
input time time5. sample;
datalines;
09:00 200
09:59 201
11:04 202
12:02 203
14:01 204
14:59 205
15:59 206
16:59 207
18:00 208
;
/* WORK.TWO의 TIME 변수의 값이 WORK.ONE의 TIME 변수의 값과
5분 이내에 존재하는 확인하기 위하여 HASH 테이블을 사용한다.*/
data out;
length time sample 8;
/* 데이터 스텝의 첫 번째 반복 작업에서 Hash 테이블 H를 생성하고 인스턴트화 한다.
DATASET: 인수 태그를 사용하여서 Hash 테이블 H에 WORK.TWO 데이터 세트를 로딩한다.
HASH 테이블 검색을 위하여 TIME 변수를 키 변수로 정의한다.
KEY 변수는 기본적으로 출력되지 않기 때문에, TIME 변수를 SAMPLE 변수와 함께 데이터 변수로 정의한다.
로그에 "지정된 변수가 초기화되지 않았습니다." 메시지 출력을 방지하기 위하여,
데이터 세트 변수 TIME,SAMPLE 변수를 결측치 값으로 초기화한다.
HASH 반복기(반복기) 이름을 HITER로 선언한다.
*/
if _n_=1 then do;
declare hash h(dataset:'two',hashexp:4);
h.definekey('time');
h.definedata('time','sample');
declare hiter hiter('h');
h.definedone();
call missing(time, sample);
end;
/* ONE 데이터 세트에서 관측치를 읽은 후 TIME, SAMPLE 변수의 이름을 변경한다. */
set one(rename=(time=time1 sample=sample1));
/* HASH 테이블에서 첫 번째 항목으로 이동하여 첫 번째 데이터 항목을 반환한다. 이동 작업이 성공한 경우 RC=0 로 결과값을 반환한다. */
rc=hiter.first();
do while (rc=0);
/* TIME1과 HASH 테이블의 TIME 값에 대한 차의 절대값이 5분 미만인 경우에 데이터 항목을 반환하고,
현재 처리 중인 DO WHILE 구문의 반복 작업을 중지 후 다음 작업을 수행한다. */
if abs(time1-time) lt 300 then leave;
/* 5분이 초과하는 경우 HASH 테이블에서 다음 데이터 항목으로 이동하여서 새로운 값으로 위 로직을 다시 체크한다. */
rc1=hiter.next();
/* NEXT() 매소드가 다음 항목을 발견하지 못하면,
SAMPLE과 TIME 변수를 결측치로 할당하고 ONE 데이터 세트의 다음 관측치를 기준으로 반복 작업을 수행한다. */
if rc1 ne 0 then do;
sample=.;
time=.;
leave;
end;
end;
run;
proc print;
format time time1 time8.;
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!