본문 바로가기
SAS

[SAS] sas에서 그룹(key)별로 특정값들의 조합이 있는 경우의 그룹만 추출하는 방법

by SASBIGDATA김진휘 2014. 5. 26.

sas에서 그룹(key)별로 특정값들이 조건에 따라 존재하는 경우의 그룹(key)만 추출하는 방법에 대해서 알아보자.

 

 

아래 그림을 통해서 어떤 경우(조건)들의 추출하는지에 대해서 알아보자.

 

 

위의 왼쪽이 샘플데이터이다. key(그룹)별로 code값에 조건의 값들이 있는 경우를 출력하는 것이다.

조건은 key별로 A, B, C가 존재하는 경우, A와 C가 존재하는 경우, B와 C가 존재하는 경우의 key값만 출력한다.

key별로 A와 B조합만 있는 경우는 출력하지 않는다.

key값 1인 경우는 code에 A,B,C가 있으므로 출력

key값 2인 경우 10인 경우는 code에 A,C가 있으므로 출력

key값 3인 경우는 code에 B,C가 있으므로 출력

key값 4인 경우는 A, B의 조합이므로 출력하지 않는다.

 

그림과 함께 코딩설명 

 

 

data test;
input key code$ @@;
cards;
1 B 1 C 2 A 2 C 1 A 2 S 3 C 3 B 3 C
4 A 7 A 4 A 4 B 5 T 6 C 6 C 10 A 10 C
7 A 7 A 8 C 8 C 9 S 9 T 9 Y
;
RUN;

PROC SORT DATA=TEST out=test_1; BY KEY; RUN;

 

예제 데이터를 생성하고 key별로 정렬을 한다.(key별로 딱히 정렬할 필요는 없으나 설명할때 보기 좋기 위해 한 것)

 

 

 

data test1;
set test;
if code='A' OR code='B' OR code='C';RUN;

proc sort data=test1 out=test2 nodupkey; by key code; run;

 

code값이 A 또는 B 또는 C인것을 출력하고, key그룹별 code값을 중복제거 한다.

 

 

data test3;
set test2;
if code='A' then p=1;
else if code='B' then p=1;
else if code='C' then p=2;
run;

PROC MEANS DATA=TEST3 NOPRINT;
BY KEY;
VAR P;
OUTPUT OUT=TEST4(DROP=_TYPE_ _FREQ_) SUM=SUM;
RUN;

DATA TEST5;
SET TEST4;
IF SUM<3 THEN DELETE;
RUN;

code가 A인 경우 1, B인 경우 1, C인 경우 2라는 값을 P라는 새로운 변수를 생성해 부여한다.

그리고 proc means를 이용해 key별로 p변수의 값들의 합계를 구한다.

마지막으로 sum합계가 3보다 작은 경우를 제거한다.

우리가 원하는 조건의 그룹 key값만 남게 된다.

 

왜 숫자를 부여하고 sum값을 이용해 3이하는 제거하는가?

생각해보자. 이미 사전에 필요없는 값들은 다 걸러내고 A와 B와 C만 뽑아낸 상태에서 중복제거를 실시했다.

그렇다면 데이터는 그룹별로 중복이 없는 A, B, C값만 남게 된다.

조합이 A, B, C인 경우와 A, C인 경우 그리고 B, C인 경우만 출력하고 싶다.

모든 조합 조건의 공통부분이 C가 포함이 되는 것이다.

A와 B가 있을 경우 각각 1, 1 을 부여했으므로 합이 2가 된다.

A만 있을 경우 1, B만 있을 경우 1, C만 있을 경우 2가 된다.

우리가 원하는 조합의 경우의 합은 최소 3이상이 된다.

A(1)+B(1)+C(2)=4

A(1)+C(2)=3

B(1)+C(2)=3

그러므로 그룹별 P의 합계가 3미만인 것을 제거하면 우리가 원하는 조합만 추출할 수가 있는 것이다.

 

[전체 풀 코딩]

 

/*예제데이터생성*/

data test;
input key code$ @@;
cards;
1 B 1 C 2 A 2 C 1 A 2 S 3 C 3 B 3 C
4 A 7 A 4 A 4 B 5 T 6 C 6 C 10 A 10 C
7 A 7 A 8 C 8 C 9 S 9 T 9 Y
;
RUN;

 

/*KEY별로 정렬 (필요유무에 따라 실시, 안해도 상관없음)*/

PROC SORT DATA=TEST out=test_1; BY KEY; RUN;

 

/*CODE에 A, B, C 값만 추출*/

data test1;
set test;
if code='A' OR code='B' OR code='C';RUN;

 

/*KEY별로 CODE값 중복제거*/

proc sort data=test1 out=test2 nodupkey; by key code; run;

 

/*CODE각 값에 따른 P변수를 생성하여 숫자 부여*/

data test3;
set test2;
if code='A' then p=1;
else if code='B' then p=1;
else if code='C' then p=2;
run;

 

/*KEY별로 P변수의 합계 생성*/

PROC MEANS DATA=TEST3 NOPRINT;
BY KEY;
VAR P;
OUTPUT OUT=TEST4(DROP=_TYPE_ _FREQ_) SUM=SUM;
RUN;

 

/*합계가 3미만인 것은 제거 결과 출력*/

DATA TEST5;
SET TEST4;
IF SUM<3 THEN DELETE;
RUN;

WWW.SASBIGDATA.COM 김진휘

 

댓글