매크로(Macro)는 한마디로 자동화 프로그램을 의미합니다. 복잡한 코드 단어를 간단한 방법으로 수정할 수 있으며 반복되는 작업도 간단하게 만들 수 있습니다. 매크로는 문자 변수나 숫자 변수로 생성이 됩니다. 변수 속성을 바꾸고 싶으시다면, 매크로 변수 생성 이후, 값을 변환하는 과정을 거쳐야 합니다.
[출처] https://wikidocs.net/31827
이번 포스팅은 위키독스 "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 |
댓글