본문 바로가기
Data_Analysis/SAS

[SAS] Macro

by Classic! 2020. 11. 23.

매크로(Macro)는 한마디로 자동화 프로그램을 의미합니다. 복잡한 코드 단어를 간단한 방법으로 수정할 수 있으며 반복되는 작업도 간단하게 만들 수 있습니다. 매크로는 문자 변수나 숫자 변수로 생성이 됩니다. 변수 속성을 바꾸고 싶으시다면, 매크로 변수 생성 이후, 값을 변환하는 과정을 거쳐야 합니다.

 

[출처] https://wikidocs.net/31827

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

이번 포스팅은 위키독스 "SAS로 하는 기초 데이터 전처리, 핸들링(Data handling)


[매크로 기본 문법]

① 매크로를 생성할 때는 % LET 명령어를 통해 만듭니다. 반드시 ‘%’를 붙여야 SAS는 이를 매크로 칼럼 생성으로 인식합니다.  
‘%’는 표로 이뤄진 결과값을 출력하는 게 아니라 SAS에 명령어를 인식시키거나 로그기록에만 출력을 할 때 사용하는 명령어입니다.  
‘%’가 들어가는 명령어는 표로 이뤄진 결괏값을 출력하지 않는다는 점을 기억하면 됩니다. % LET을 통해 매크로를 생성할 수 있습니다.  
%LET NAME=존의 경우 매크로 변수 NAME을 입력할 경우 ‘존’이라는 데이터를 출력하라는 의미입니다. 

② '&'명령어를 통해 % LET명령어로 생성된 매크로 변숫값을 불러올 수 있습니다.  
이를 매크로 트리거(방아쇠라는 의미)라고 합니다. 모든 매크로는 ‘&’을 통해 불러옵니다.  
따라서 &NAME. 을 입력할 경우 SAS는 이를 매크로 칼럼 NAME을 불러오라는 명령어로 인식합니다. 그래서 ‘존’이라는 값이 출력됩니다. 

③ %PUT명령어의 경우 표로 이뤄진 결괏값을 출력하는 게 아니라 로그 기록에 결괏값을 출력하는 명령어입니다. % PUT 명령어를 통해 매크로 칼럼과 결괏값을 로그 창에서 확인할 수 있습니다.  
%PUT &=NAME. 은 매크로 칼럼 NAME의 결괏값을 출력하라는 명령어입니다. 그리고 % PUT &NAME. 은 매크로 칼럼 NAME의 결괏값만을 출력하게 됩니다.  
&=NAME.은 매크로 칼럼과 결괏값을 동시에 출력하고 &NAME. 은 결괏값만을 출력하게 됩니다. 

[출처] https://wikidocs.net/31827

 

 

[데이터셋 구축]

/* LIBRARY 생성 */
LIBNAME dataset "C:/바탕 화면/playdata/ice/py_work/SAS/data";

/* 데이터 셋 생성 */
DATA dataset.fin;
  INFILE "C:/바탕 화면/playdata/ice/py_work/SAS/data/finance.csv";
  INPUT 
  gender $
  age
  Investment_Avenues $
  Mutual_Funds
  Equity_Market
  Debentures
  Government_Bonds
  Fixed_Deposits
  PPF
  Gold
  Stock_Marktet $
  Factor $
  Objective $
  Purpose $
  Duration $
  Invest_Monitor $
  Expect $
  Avenue $
  What_are_your_savings_objectives? $
  Reason_Equity $
  Reason_Mutual $
  Reason_Bonds $
  Reason_FD $
  Source $
  ;
RUN;

 

 

[SQL문에서 매크로 활용]

아래 코드에서는 %LET 으로 gen_f변수에 "Female" 값을 직접 할당합니다.

/* 매크로 SQL */
%LET gen_f="Female";

PROC SQL;
  SELECT gender,age,Invesr_Monitor, Reason_Equity
  FROM dataset.fin;
  WHERE gender=&gen_f.
  ;
QUIT;

 

 

[CALL SYMPUT]

%LET 명령어가 직접 명령어를 하나하나 입력해야 하는 명령어입니다.

반면 CALL SYMPUT은 주로 테이블을 활용(테이블 없이도 가능)해서 자동으로 매크로 변수를 생성할 때 사용하는 명령어입니다. 

/* 매크로 CALL SYMPUT : 자동 입력*/
/* fin에서 id열이 추가된 fin_id 데이터 셋 만들기 */
DATA dataset.fin_id;
  SET dataset.fin;
  /* gender,age컬럼 합쳐서 ID열 만들기 */
  ID=CATS(gender,age);
RUN;

/* fin에서 id열이 추가된 fin_id 데이터 셋 만들기 */
DATA _NULL_;
  SET dataset.fin_id;
  CALL SYMPUT(ID,age);
RUN;

%PUT &=Male29;
/* 결과 : Male29=29*/
%PUT &Female25;
/* 결과 : 25*/

 

 

[INTO]

INTO명령어는 SQL프로시저에서 사용하는 명령어입니다.

주로 SQL로 연산을 시행하면서 나오는 수치를 매크로화 시킬 때 사용하는 명령어입니다. 
아래 첫번째 예제에서는 조건 Stock_Market="Yes"를 만족하는 데이터에서 age 칼럼의 전체 변수의 개수를 구하고 이를 매크로 변수 age_CNT의 값으로 설정하게 됩니다. 
COUNT명령어뿐만 아니라 SUM, MEAN 등 다양한 연산 명령어를 활용하여 매크로 변수를 생성할 수 있습니다.

[예제1]
PROC SQL;
   TITLE "MACRO INTO age_CNT";
   SELECT COUNT(age) INTO :age_CNT
   FROM dataset.fin_num
   WHERE Stock_Market="Yes";
QUIT;
%PUT &=age_CNT;


[예제2]
PROC SQL;
  TITLE "MACRO INTO Mutual_Funds_AVG_by_gender";
  SELECT
    gender,
    AVG(Mutual_Funds) INTO : Mutual_Funds_AVG
  FROM dataset.fin_num
  GROUP BY gender;
QUIT;
%PUT &=Mutual_Funds_AVG;

 

 

[매크로화(%MACRO)]

전체 명령문을 매크로 화하는 방법을 배워보겠습니다. 전체 명령문을 매크로화 시키면 전체 명령문을 반복해서 입력하지 않아도 됩니다. 하나의 문장으로 대체가 가능합니다. 

/* MACRO 활용한 문장의 매크로화(%MACRO) */
%MACRO macro_tbl(age_cut,stock_cut); 
/*매크로 macro_tbl와 age_cut와 stock_cut 매크로변수도 함께 생성*/
PROC SQL;
TITLE "MACRO 활용한 문장의 매크로화(%MACRO) macro_tbl"
  CREATE TABLE macro_tbl AS
    SELECT
    gender,
    age,
    Mutual_Funds,
    Equity_Market
    Debentures,
    Government_Bonds,
    Fixed_Deposits,
    PPF,
    Gold
    FROM dataset.fin_num
    WHERE age=&age_cut. /*AGE의 값이 &age_cut.과 동일한 행을 추출합니다*/
    AND Stock_Market=&stock_cut./*Stock_Market의 값이 &stock_cut.과 동일한 행만 추출합니다*/
    ORDER BY age ASC
    ;
  QUIT;   /*매크로 macro_tbl의 명령어를 입력합니다*/
  
PROC PRINT DATA=macro_tbl;RUN;  /*출력*/
%MEND;  /*매크로 macro_tbl 생성을 종료합니다*/

%macro_tbl(20,'Yes'); /*매크로 macro_tbl를 시행합니다*/

 

 

[DO로 매크로 자동화]

/* DO로 매크로 자동화*/
%MACRO macro_do(CUT_STRT);  /*매크로 macro_do를 생성하고 매크로변수 CUT_STRT를 생성합니다.*/
  %DO I=&CUT_STRT. %TO 25;    /*매크로용 DO명령어 통해 매크로변수I를 생성합니다. I는 &CUT_STRT.부터 25까지 시행합니다*/  
    PROC SQL;
      CREATE TABLE macro_do_&I. AS    /*매크로변수I의 순서대로 테이블TEST_13, TEST_14, TEST_15를 생성합니다*/
      SELECT *
      FROM dataset.fin_num
      WHERE age=&I.   /*칼럼AGE의 값이 &I.인 행만을 추출합니다*/
      ;
    QUIT;
  PROC PRINT DATA=macro_do&I.;RUN;  /* 매크로 테이블 프린트 */
  %END;   /*매크로용 DO명령어의 끝을 알려줍니다. 다음번 &I.를 시행합니다. 만약 다음번 &I.가 없을 경우 반복을 중단합니다*/
%MEND;  /*매크로 macro_do 생성을 종료합니다*/


%macro_do(20);  /*매크로 macro_do를 시행합니다. CUT_STRT의 값은 20으로 설정합니다*/

'Data_Analysis > SAS' 카테고리의 다른 글

[SAS] 기술통계량 산출 및 정규성 검정  (0) 2021.01.04
[SAS] 자료 행 분할  (0) 2020.12.01
[SAS] SQL문  (2) 2020.11.23
[SAS] Data Step  (0) 2020.11.16
[SAS] 라이브러리 설정  (0) 2020.11.16

댓글