[SAS 프로그래밍] 누락된 결측값 채우기
안녕하세요^^
이번 시간에는 두 개의 테이블을 이용하여 누락된 값을 채우는 방법에 대해 알아보겠습니다.
▶ 예제데이터 생성하기
누락된 값을 채우기 위한 두 개의 연관된 테이블을 만들어 보겠습니다.
▷ DATA1
============================================================
▷ DATA2
• Data step을 사용하여 league1과 league2 데이터셋을 생성합니다.
• 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)로 정렬합니다.
먼저 작년 자료인 league1을 proc sort 프로시저를 사용하여 정렬하며, by 문장에는 정렬시킬 변수를 입력합니다.
▷ coding
Full_name=catt(firstname, " ", lastname);
• 작년도 자료인 league1의 fullname이 결측인 경우가 존재하기 때문에, 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한 후 가져옵니다.
• 만약 작년도 자료인 league1의 Fullname 변수가 누락되었으면 전년도 자료인 new_league2의 값에서 대체합니다.
if Fullname=' ' then Fullname=Full_name;
• 또한 작년도 자료인 league1의 avgscore 변수가 누락되었으면 전년도 자료인 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이라고 인덱싱하고, league2를 prioryr이라고 인덱싱합니다.
• 특히 league1과 league2를 full join하며, league1의 bowler 변수와 prioryr의 amfno가 같을 때의 값을 결합합니다.
from league1 as lastyr full join league2 as priory
on lastyr.bowler=prioryr.amfno
• coalesce(a,b) 함수를 사용하여 변수 a와 b 중 결측이 아닌 값을 출력합니다.
• coalesce 함수로 league1 자료의 fullname과 league2 자료의 firstname과 lastname을 공백을 추가하여 만든 값 중 결측이 아닌 값을 name이라는 변수로 출력합니다.
• 이 때 lastyr로 인덱싱한 league1 자료의 fullname은 lastyr.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 자료의 avgscore과 league2 자료의 avgscore 변수 중 결측이 아닌 값은 Average 변수로 출력합니다.
coalesce(lastyr.avgscore,prioryr.avgscore)as Average format=8.
• order by 문장을 사용하여 bowler 변수를 기준으로 정렬합니다.
이상으로 두 개의 테이블을 이용하여 누락된 값을 채우는 방법에 대해 알아보았습니다.
감사합니다^^
[출처]
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.