사이트맵  |  Contact Us
 
홈 > SAS Tech & Tip > SAS Programming
[SAS 프로그래밍] 누락된 결측값 채우기 2017.11.20
MYSAS 시샵 2446 0
http://www.mysas.co.kr/SAS_tiptech/a_question.asp?b_no=7526&gotopage=7&con=subject&keyword=&cmd=content&bd_no=05&gubun=

[SAS 프로그래밍] 누락된 결측값 채우기

 

 

안녕하세요^^

 

이번 시간에는 두 개의 테이블을 이용하여 누락된 값을 채우는 방법에 대해 알아보겠습니다.

 



▶ 예제데이터 생성하기

누락된 값을 채우기 위한 두 개의 연관된 테이블을 만들어 보겠습니다.

 

  DATA1

 

 

 ▷ DATA2

 

 

 

  Data step을 사용하여 league1league2 데이터셋을 생성합니다.

 • league1 데이터셋에는 full name, bowler, average score가 있으며, 작년의 볼링 average socre에 대한 자료입니다.

 • league2 데이터셋에는 first name, last name, AMF Number, average score가 있으며, 전년도 볼링 average score에 대한 자료입니다.


 

 

 

 

▶ 자료분석의 목적

▷ 볼링선수가 다른 볼링리그의 멤버일 때 볼링선수의 average score를 분석하여 새 팀을 구성합니다.

▷ 가능한 각 볼링선수의 가장 최근 리그(작년) average score를 사용합니다.

▷ 하지만 선수가 작년 리그 average score가 없다면 전년도 average score를 입력하여 average score를 분석하고자 합니다.

 

 

 

 

DATA STEP 사용하기

 

 

  coding

 

두 자료를 가로병합하기 위해 두 자료에 공통으로 있는 볼링선수 번호(Bowler)로 정렬합니다.

먼저 작년 자료인 league1proc sort 프로시저를 사용하여 정렬하며, by 문장에는 정렬시킬 변수를 입력합니다.

 

 

 

  coding

 

Full_name=catt(firstname, " ", lastname);

 

작년도 자료인 league1fullname이 결측인 경우가 존재하기 때문에,

  league2 자료의 firstname 변수와 lastname 변수를 결합하여 Full_name 변수를 생성합니다.

 

전년도 자료인 league2에는 작년 자료인 league1과 볼링선수 번호가 공통으로 들어있습니다.

하지만 두 자료에서의 변수명이 다르면 data step의 가로병합은 가능하지 않습니다.

 

따라서 league2 자료의 볼링선수 번호(AMFNo) 변수를 league1 자료와 동일하게 bowler로 변경시킵니다.

 

rename AMFNo=bowler;

 

 

또한 전년도 자료의 평균 점수는 작년도 자료의 avgscore와 구분하기 위해 AverageScore로 변수명을 변경시킵니다.


rename AvgScore=AverageScore;

 

작년자료인 league1과 가로병합하기 위해 proc sort 프로시저를 사용하여 정렬합니다.


 

  coding

 

두 자료를 data step에서 merge 문장을 사용하여 가로병합합니다.

이 때 league2를 수정한 자료인 new_league2는 불필요한 변수인 firstname 변수와 lastname 변수를 drop한 후 가져옵니다.


만약 작년도 자료인 league1Fullname 변수가 누락되었으면 전년도 자료인 new_league2의 값에서 대체합니다.


if Fullname=' '  then Fullname=Full_name;



또한 작년도 자료인 league1avgscore 변수가 누락되었으면 전년도 자료인 new_league2의 값에서 대체합니다.


if AvgScore=. then AvgScore=AverageScore;


 ▷ 결과

data step에서 두 자료의 누락값을 대체하는 방법에 대해 알아보았습니다.

, 결과를 살펴보면 작년 리그 average score가 없다면 전년도 average score를 입력하여 average score를 분석할 수 있게 되었습니다.

 

 

 

 

 

PROC SQL 사용하기

PROC SQL 문장을 사용하여 원하는 조건의 average score 분석 테이블을 만들 수 있습니다.

 

 

  coding

 

from 문장에서는 league1 데이터셋을 lastyr이라고 인덱싱하고, league2prioryr이라고 인덱싱합니다.

특히 league1league2 full join하며, league1bowler 변수와 prioryramfno가 같을 때의 값을 결합합니다.


from league1 as lastyr full join league2 as priory

on lastyr.bowler=prioryr.amfno

 

 

coalesce(a,b) 함수를 사용하여 변수 ab 중 결측이 아닌 값을 출력합니다.

coalesce 함수로 league1 자료의 fullnameleague2 자료의 firstnamelastname을 공백을 추가하여 만든 값 중 결측이 아닌 값을 name이라는 변수로 출력합니다.

이 때 lastyr로 인덱싱한 league1 자료의 fullnamelastyr.fullname으로 말할 수 있습니다.

 

           select coalesce(lastyr.fullname,

              trim(prioryr.firstname) ||' '||prioryr.lastname)as Name format=$26.,

 

 

또한 league1 자료의 bowler 변수와 league2 자료의 amfno 변수 중 결측이 아닌 값을 bowler 변수로 출력합니다.

coalesce(lastyr.bowler,prioryr.amfno)as Bowler,

 

league1 자료의 avgscoreleague2 자료의 avgscore 변수 중 결측이 아닌 값은 Average 변수로 출력합니다.

coalesce(lastyr.avgscore,prioryr.avgscore)as Average format=8.

 

 

order by 문장을 사용하여 bowler 변수를 기준으로 정렬합니다.

 ▷ 결과

PROC SQL을 사용하여 data step에서 두 자료의 누락값을 대체한 결과와 동일한 결과를 얻었습니다.

결과를 살펴보면 작년 리그 average score가 없다면 전년도 average score를 입력하여 average score를 분석할 수 있게 되었습니다.

 

 

 

이상으로 두 개의 테이블을 이용하여 누락된 값을 채우는 방법에 대해 알아보았습니다.

감사합니다^^

 

[출처] http://support.sas.com/documentation/cdl/en/sqlproc/63043/HTML/default/viewer.htm#n1hg5l3d8c24fin19bcm2v9j3s5i.htm

 

 

 

 

 

 

 

 

 
 
휴대폰 번호
휴대폰 인증번호
 
 [SAS 프로그래밍] 데이터 셋 비교하기
 [SAS 프로그래밍] 여러 개의 열의 데이터 요약하기