로그인   |  회원가입  |  사이트맵  |  Contact Us
  아이디 저장하기
 
홈 > SAS Tech & Tip > SAS Programming 활용하기
[SAS 프로그래밍] 매크로 언어 - CALL EXECUTE 2017.12.20
MYSAS 시샵 452 0
http://www.mysas.co.kr/SAS_tiptech/a_question.asp?b_no=7573&gotopage=1&con=subject&keyword=&cmd=content&bd_no=05&gubun=

[SAS 프로그래밍] 매크로 언어 – CALL EXECUTE

 



안녕하세요. ^^


지난 시간에는 매크로 변수로 많이 활용되는 CALL SYMPUT routine에 대해 살펴보았습니다.

이번 시간에는 CALL macro routine과 관련하여 CALL EXECUTE routine에 대해 알아보도록 하겠습니다.

 


CALL EXECUTE를 사용하여 DATA step 내에서 매크로를 실행할 수 있습니다.

또한 이를 활용하여 매크로를 여러 번 실행하는 반복 작업을 한번에 실행할 수 있습니다. 


 

먼저, CALL EXECUTE는 아래와 같이 정의됩니다.

 

 

CALL EXECUTE(argument);

 

 

 

 

예제 데이터

 

예제로 사용할 데이터는 sashelp 내의 classfit 데이터 입니다.

 

 

 



CALL EXECUTE 사용

먼저 간단한 예시들로 이 매크로 언어가 어떻게 사용되는지 확인해 보겠습니다.

 

 

coding

위의 예시와 같이 CALL EXECUTE를 사용하면 원래는 단독으로 사용되던 %PUT 매크로가 DATA step 내에서 사용이 가능해집니다.

 

LOG창에서 “Hello world” 가 출력된 것을 확인 할 수 있습니다.


  

 

 

 

 

coding

이번에는 DATA step에서 classfit 데이터를 불러들여와서 해당 데이터에 있는 변수 name을 사용하였습니다.

결과는 오른쪽과 같이 %PUT 매크로와 문자들 “Students name is “과 함께 name 변수의 값들이 모두 출력되어 나옵니다.

 

이 결과는 두번째 코드에서 처럼

%put Students name is _______ 를 반복적으로 실행하는 것과 같은 결과를 출력합니다.

같은 작업을 여러 번 하지 않으면서 변수의 값들을 오류없이 그대로 가져와 사용할 수 있어 효과적입니다.


 

 

 

 

 

DATA step 내에서 새로운 DATA step 혹은 PROC procedure 실행 시키기

하나의 DATA step 내에서 또 다른 DATA step/ procedure 들이 실행되도록 할 수 있습니다.


 


 

                                                         


….

coding

먼저 SET문 으로 classfit 데이터를 불러들여와서 데이터 내의 값들을 활용하고자 합니다.

 

다음으로 CALL EXECUTE를 사용하여

classfit에서의 변수 name 값이 조건절과 일치하는 데이터만 work에 새로운 데이터 셋으로 생성하고자하며, 생성되는 데이터 셋 이름은 조건절에서의 name변수의 값으로 지정되게 하였습니다.

위의 내용이 classfit 내에 있는 모든 관측치에 대하여 반복적으로 실시됩니다.

 

이 때, 문자열을 합치는 || 를 사용하였습니다.

대신에 catx문과 같이 문자열을 합치는 다른 함수들을 사용할 수 도 있습니다.

 

결과는 오른쪽과 같이 학생들의 이름으로 명명된 데이터셋들이 생성되었고,

각각의 데이터 셋 안에는 해당 학생의 정보가 저장되어 있습니다.

 

이 결과는 두 번째의 코드처럼 data step을 일일히 여러 번 시행한 것과 같은 결과입니다.

 


 



이번에는 DATA step내에서 PROC MEANS 가 실행되는 예시를 보도록 하겠습니다.

 



 

 

 

 

 

 

 

 

 

coding

이번에 사용된 예제 데이터는 라이브러리 sashelp에 있는 CARSGAS 데이터 셋입니다.

 

CARDS; 에 불러올 데이터 셋 이름들을 입력하고

앞서 CALL EXECUTE data step을 새롭게 사용하였던 것과 같이

이번에는 proc means 프로시저가 실행되도록 하기 위해 CALL EXECUTE proc means를 입력하였습니다.

이번에도 마찬가지로 문자열을 합칠 때 || 를 사용하였습니다.

 

결과는 오른쪽과 같이 각각의 데이터 셋에 대해 proc means가 실행되어 출력되었습니다.

이 결과는 아래의 PROC MEANS DATA=sashelp.cars ; RUN; 의 코드를 데이터 이름에 따라 여러 번 시행하는 것과 동일한 결과입니다.


 

 

 



▶ 여러 SAS data set 한번에 불러들이기 / 내보내기

위에서 다루었던 내용들을 활용하여 여러 개의 SAS data set 을 한번에 옮겨보도록 하겠습니다.

 

 

 

 

 

                   

....

                                      

coding

예시에서는 SAS 내 라이브러리 sashelp에 있는 여러 데이터 셋들을 한번에 work로 저장하겠씁니다.

 

먼저 첫 번째 DATA step에서 가져오고자 하는 데이터 셋 명들을 tname이라는 변수에 저장되도록 하여 tablelist라는 데이터 셋을 생성하였습니다.

 

다음으로 매크로 변수 %let 을 사용하여 work sashelp라는 라이브러리 이름을 지정해 주었습니다.

 

마지막 코드에서

SET tablelist : 방금 만든 tablelist 데이터를 가져와 사용할 것을 지정하고,

CALL EXECUTE : sashelp에 변수 tname에 저장되어 있는 이름과 같은 이름을 갖고 있는 데이터 셋들을 불러와서 work에 저장되도록 지정하였습니다.


결과는 오른쪽과 같이 work위치에 해당 데이터 셋들이 생성된 것을 확인하였습니다.

 

만약 %let 매크로에 sashelpwork의 라이브러리가 아닌, 사용자가 원하는 경로를 지정해 주게 되면

여러 개의 데이터 셋들을 원하는 곳으로부터 다른곳으로 옮기거나 SAS밖으로 내보내기, SAS로 불러오기 작업들도 간단하게 시행할 수 있어 유용하게 사용할 수 있습니다.  


 

 

 

지금까지 매크로 언어 중 CALL EXECUTE에 대해 알아보았습니다.

 

감사합니다^^


 

 

[REFERENCE]

http://www.lexjansen.com/phuse/2014/cc/CC06.pdf

https://blogs.sas.com/content/sgf/2017/08/02/call-execute-for-sas-data-driven-programming/;



 

 
 
 
 
 [SAS 프로그래밍] 데이터의 개체 수(Number of observations) 계산하기
 [SAS 프로그래밍] 매크로 언어 - CALL SYMPUT