* 제목 : Hash 테이블을 사용하여서 데이터 클린징 작업 수행하기;
* Sample 25983: Performing data cleansing using a hash table;
* 출처 : http://support.sas.com/kb/25/983.html;
* 목적 : 문자 변수에 대한 데이터 클린징 작업을 수행한다.
사용자가 지정한 단어에 대한 대문자 변경 작업과
특정 구문 부호 뒤에 위치하는 문자에 대하여 첫 문자를 대문자(나머지 소문자)로 변경하는 작업을 수행한다.
이 예제는 CHECK() 매소드를 설명한다.;
data caps;
infile datalines truncover;
input cap $15.;
datalines;
DATA
SAS
_NEW_
ADD
;
options linesize=130;
data test;
infile datalines truncover;
input c $125.;
datalines;
The data step is very powerful. the data step has been part of sas since at least 1976.
Using dot notation makes your sas programs easier to read.
Use the _new_ statement to instantiate an object.
You can use the add method in one of two ways to store data in a hash object.
baek, seung. mIN.
;
/* 변수 C에서 각각의 단어를 추출하여 대문자로 변경한 후에 이 값이 Hash 오브젝트 H에 존재하는지 여부를 확인하기 위하여 CHECH 매소드를 사용한다.
반환 코드가 Zero(0)이면, Key가 발견되었음을 표시한다. */
data upcased;
set test;
length cap $ 15;
/* 데이서 스텝의 첫 번째 반복 작업에서 Hash 테이블 H를 생성하고 인스턴트화 한다.
DATASET: 인수 태그를 사용하여서 Hash 테이블 H에 WORK.CAPS 데이터 세트를 로딩한다.
일치하는 값을 찾기 위하여 CAP 변수를 키(KEY) 변수로 정의한다.
또한, CPA 변수를 출력하기 위하여 데이터 항목으로 정의한다. */
if _n_ = 1 then do;
declare hash h(dataset: "work.caps");
h.definekey('cap');
h.definedata('cap');
h.definedone();
/* 로그에 "지정된 변수가 초기화되지 않았습니다." 메시지 출력을 방지하기 위하여,
데이터 세트 변수 cap 변수를 결측치 값으로 초기화한다. */
call missing(cap);
end;
length final $ 125;
/* NUMW 변수에 변수 c에 존재하는 단어의 개수를 할당한다. */
numw=countc(trim(c),' ')+1;
/* SCAN 함수는 변수 C에서 개별 단어를 추출한다. SCAN 함수로 분리된 단어를 대문자로 변경 후에
이 값과 일치하는 KEY 값이 존재하는지 확인하기 위하여 CHECK 매소드를 사용한다.
일치하는 값이 존재하면, 0 값을 반환한다.
/* HAHS 테이블에서 일치하는 KEY 값을 발견하였으면, CATX 함수를 사용하여서 FINAL 변수와 TEMP 변수의 첫번째 값을
대문자로 전환한 값을 공백을 사이에 구분자로 삽입하여 결합한 후에 이 값을 FINAL 변수로 할당한다.
/* HASH 테이블에서 일치하는 KEY 값을 발견하지 못하면, CATX 함수를 사용하여서 FINAL 변수와
TEMP 변수를 소문자로 전환한 값을 공백을 사이에 구분자로 삽입하여 결합한다. */
do i=1 to numw;
temp=scan(c,i,' '); * DO 반복문을 사용하여서 C변수의 개별 단어를 순차적으로 추출하여 작업한다;
if h.check(key:upcase(temp))=0 then final=catx(' ',final,upcase(temp));
else do;
* 관측치의 첫 번째 단어 또는 이전 단어에 인용부호가 포함된 현재 처리중인 단어에 대하여
첫번째 문자를 대문자로 나머지 문자를 소문자로 변경한다.;
if i=1 or indexc(scan(c,i-1,' '),',.;:') ne 0 then do;
final=catx(' ',final,propcase(temp));
end;
else final=catx(' ',final,lowcase(temp));
end;
end;
keep final;
run;
proc print;
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.