일/Data Mining

[SAS Tip] SAS 데이터셋 생성시 set문 2번 쓰기.

LEEHK 2008. 4. 30. 18:31

* 부제

: 전체 데이터셋에 summary 정보 붙이기

: Merging a Single Observation with All Observations

 

* 개요.

: 간혹, summary 성 정보를 구해서, 전체 데이터셋에 재 적용해야 할 필요가 있을 때가 있습니다. (각 섹션별 쿼리 비율 구하기 등)

  그럴 때 코딩 편의와 효율을 따질 수 있는 Tip 소개합니다.

 

* 결론 (추천 방안)

: 소요 시간은 Macro를 쓰나, set문을 2번 쓰나 큰 차이 없습니다만, 아무래도 set문을 2번 쓰는 쪽이 코딩량도 적어서 편리합니다.

 

 

1. 원본 데이터셋 : 각 section별 쿼리 수가 붙어 있습니다.

section qcnt
AAA1 100
AAA2 200
AAA3 300
AAA4 400
AAA5 500
AAA6 600
AAA7 700
AAA8 1323
AAA9 2323
BBB1 34534
BBB2 235
BBB3 12424
BBB4 1355

 

 

2. 총 쿼리수 구하기.

 

/* qcnt_sum 구하기 */

proc means data=qcnt noprint;

var qcnt;

output out=qcnt_sum(drop=_freq_ _type_) sum(qcnt)=qcnt_sum;

run;

 

qcnt_sum
54994

 

 

 

3. 전체 데이터셋에 summary 정보 붙이기.

 

 

/* 옳은 방법 1 : macro 사용 */

data _null_;

set qcnt_sum;

call symput('qcnt_sum',qcnt_sum);

run;

 

data qcnt_rate1;

set qcnt;

qcnt_sum="&qcnt_sum";

qcnt_rate=round(qcnt/&qcnt_sum,0.0001);

run;

 

section qcnt qcnt_sum qcnt_rate
AAA1 100 54994 0.0018
AAA2 200 54994 0.0036
AAA3 300 54994 0.0055
AAA4 400 54994 0.0073
AAA5 500 54994 0.0091
AAA6 600 54994 0.0109
AAA7 700 54994 0.0127
AAA8 1323 54994 0.0241
AAA9 2323 54994 0.0422
BBB1 34534 54994 0.628
BBB2 235 54994 0.0043
BBB3 12424 54994 0.2259
BBB4 1355 54994 0.0246

 

 

 

 

 

/* 옳은 방법 2 : set문 2번 쓰기 */

data qcnt_rate2;

set     qcnt;

if _n_=1 then set qcnt_sum;

qcnt_rate=round(qcnt/qcnt_sum,0.0001);

run;

 

section qcnt qcnt_sum qcnt_rate
AAA1 100 54994 0.0018
AAA2 200 54994 0.0036
AAA3 300 54994 0.0055
AAA4 400 54994 0.0073
AAA5 500 54994 0.0091
AAA6 600 54994 0.0109
AAA7 700 54994 0.0127
AAA8 1323 54994 0.0241
AAA9 2323 54994 0.0422
BBB1 34534 54994 0.628
BBB2 235 54994 0.0043
BBB3 12424 54994 0.2259
BBB4 1355 54994 0.0246

 

 

 

/* 잘못된 방법 : merge 사용 */

data qcnt_rate3;

merge   qcnt

        qcnt_sum;

qcnt_rate=round(qcnt/qcnt_sum,0.0001);

run;

 

section qcnt qcnt_sum qcnt_rate
AAA1 100 54994 0.0018
AAA2 200 . .
AAA3 300 . .
AAA4 400 . .
AAA5 500 . .
AAA6 600 . .
AAA7 700 . .
AAA8 1323 . .
AAA9 2323 . .
BBB1 34534 . .
BBB2 235 . .
BBB3 12424 . .
BBB4 1355 . .