BookmarkSubscribeRSS Feed

[SAS 프로그래밍 고수 백승민] [RATIO] 전체 합계에 대한 비율 구하기 - 11가지 방법

Started ‎06-11-2020 by
Modified ‎06-11-2020 by
Views 179

* 출처 ; 통계분석연구회(http://cafe.daum.net/statsas/3F8j/244)

 

* 구성비 / 비율 / RATIO

* 변수의 전체 합계를 사용하여서 개별 관측값의 비율 구하기;

 

* 데이터 스텝 : 전체 합계를 자동 RETAIN;
PROC SUMMARY DATA=SASHELP.CLASS;
VAR HEIGHT;
OUTPUT OUT=CUM_SUM(DROP=_:) SUM=SUM_HEIGHT;
QUIT;

DATA BACK1;
IF _N_=1 THEN SET CUM_SUM;
SET SASHELP.CLASS;
RATIO = HEIGHT/SUM_HEIGHT;
RUN;

 

* 데이터 스텝 : 동일 스텝에서 데이터 합계 계산 후 사용하기;
DATA BACK2(DROP=I);
IF _N_=1 THEN DO I=1 TO TOBS;
SET SASHELP.CLASS NOBS=TOBS;
CUM_SUM + HEIGHT;
END;
SET SASHELP.CLASS;
RATIO = HEIGHT / CUM_SUM;
RUN;

 

* PROC SQL의 REMERGE 기능;
PROC SQL;
CREATE TABLE BACK3 AS
SELECT A.*,
CUM_SUM,
HEIGHT / SUM(HEIGHT) AS RATIO
FROM SASHELP.CLASS A,
CUM_SUM;
QUIT;

 

* PROC SLQ 인라인뷰;
PROC SQL;
CREATE TABLE BACK4 AS
SELECT A.*,
HEIGHT / CUM_SUM AS RATIO
FROM SASHELP.CLASS A,
( SELECT SUM(HEIGHT) AS CUM_SUM
FROM SASHELP.CLASS);
QUIT;

 

* 스칼라 서브쿼리;
PROC SQL;
CREATE TABLE BACK5 AS
SELECT A.*,
HEIGHT / (SELECT SUM(HEIGHT) FROM SASHELP.CLASS) AS RATIO
FROM SASHELP.CLASS A;
QUIT;

 

* EXECUTE 사용;
DATA BACK6;
IF _N_ = 1 THEN CALL EXECUTE(' PROC SQL;
SELECT SUM(HEIGHT) INTO :CUM_SUM
FROM SASHELP.CLASS;
QUIT;
');
SET SASHELP.CLASS;
RATIO = HEIGHT / INPUT(SYMGET('CUM_SUM'),BEST12.);
RUN;


* DOSUBL 함수사용;
* call execute : PROC SQL의 매크로 정의 이름과 호출 이름 동일해야함.
* dosubl : PROC SQL의 매크로 정의 이름과 호출 이름 불일치 상관없음.;
DATA BACK7;
IF _N_ = 1 THEN RC = DOSUBL(' PROC SQL NOPRINT;
SELECT SUM(HEIGHT) INTO :CUM_SUM
FROM SASHELP.CLASS;
QUIT;
');
SET SASHELP.CLASS;
RATIO = HEIGHT / INPUT(SYMGET('CUM_SUM'),BEST12.);
DROP RC;
RUN;


* 사용자 정의 함수사용 - 데이터 스텝 내에서 PROC SQL 사용;

* 다양한 방법 시도 가능;


* 사용자 함수 정의;
%MACRO SQLFUNC;
%LET SQLSELECT=%SYSFUNC(DEQUOTE(&SQLSELECT));
%LET SQLRESULTS = ;
PROC SQL NOPRINT;
&SQLSELECT;
QUIT;
%MEND;

 

PROC FCMP OUTLIB=SASUSER.FUNCS.GENERAL;
FUNCTION SQL(SQLSELECT $) $;
LENGTH SQLRESULTS $ 32767;
RC=RUN_MACRO('SQLFUNC', SQLSELECT, SQLRESULTS);
RETURN(SQLRESULTS);
ENDSUB;
QUIT;

* 사용자 정의 함수 호출;
OPTIONS CMPLIB=SASUSER.FUNCS;
DATA BACK8;
LENGTH CUM_SUM 8. ;
RETAIN CUM_SUM;
IF _N_ = 1 THEN CUM_SUM = SQL(" SELECT SUM(HEIGHT) INTO: SQLRESULTS
FROM SASHELP.CLASS ");
SET SASHELP.CLASS;
RATIO = HEIGHT/CUM_SUM;
RUN;

 

* PROC TABULATE 사용;
PROC TABULATE DATA=SASHELP.CLASS OUT=BACK9(DROP=_:);
CLASS NAME SEX AGE WEIGHT;
VAR HEIGHT ;
TABLE (NAME='이름'*SEX*AGE*WEIGHT),
HEIGHT='키' * (SUM*F=8.4 PCTSUM);
RUN;

 

* PROC REPORT 사용;
PROC REPORT DATA = SASHELP.CLASS OUT=BACK10(DROP=_:) NOWD;
COLUMN NAME SEX AGE WEIGHT HEIGHT HEIGHT=PCTSAL;
DEFINE NAME / DISPLAY '이름';
DEFINE PCTSAL / PCTSUM FORMAT=8.4;
RUN;

 

* HASH OBJECT사용;
DATA BACK11;
RETAIN CUM_SUM 0;
IF _N_=1 THEN DO;
DCL HASH H(SUMINC: 'HEIGHT');
H.DEFINEKEY('_ERROR_'); * 공통키 사용;
H.DEFINEDONE();
DO WHILE(NOT DEND);
SET CLASS END=DEND;
H.REF();
END;
H.SUM(SUM:CUM_SUM);
END;
SET SASHELP.CLASS;
RATIO = HEIGHT / CUM_SUM;
RUN;

Version history
Last update:
‎06-11-2020 10:17 PM
Updated by:
Contributors

sas-innovate-wordmark-2025-midnight.png

Register Today!

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.


Register now!

Article Labels
Article Tags