로그인   |  회원가입  |  사이트맵  |  Contact Us
  아이디 저장하기
 
홈 > 참여마당 > Question & Answer
[SAS 프로그래밍] ID(key)가 중복으로 입력된 데이터에서 교집합 추출 2018.01.21
조상균 253 0
http://www.mysas.co.kr/SAS_club/b_answer.asp?B_NO=7600&gotopage=1&cmd=content

안녕하세요?

SAS 원 데이터를 가공하는 방법을 고민하고 있는데 제가 익숙치 않다보니

하루 종일 고민해도 답이 나오지 않아 여쭤봅니다.

답변 주시면 정말 큰 도움이 될 것 같습니다.

작은 조언이라도 부탁드려요

 

예를들어서 소비자들이 어떤 상품을 사갔는지 기록된 데이터라고 해보겠습니다.

각 소비자에 대한 ID가 있고 소비자가 어떤 상품을 구매했는지 상품 코드도 있습니다.

 

지금 알고자 하는 부분은 각 상품에 대해서 아래와 같은 질문에 답을 하려는 것입니다.

1. A001을 구매한 소비자는 몇 명인가?

2. B001을 구매한 소비자는 몇 명인가?

3. A001와 B001을 둘다 구매한 소비자는 몇 명인가?

특히 3.을 아는것이 굉장히 어려운데요..

 

데이터가 각 소비자 ID 한명을 한 행으로 잡고, Column을 따라서 상품의 구매내역을 입력해 놓은 것이 아니라

구매가 일어날 때마다 (ID의 중복을 허용하는) 한 행으로 입력해놓아서 어려움이 있습니다. (원래 구매항목에 And 조건으로 필터를 하려고 했는데 아시다시피 이와 같은 데이터 형태에서는 적용되지 않을 것입니다. )

예를들어서 예시에서 100이라는 ID를 갖는 소비자는 A001, A003, B001 3가지 상품을 구매하였습니다.

 

어떤 함수를 사용하면 원하는 목적을 달성할 수 있을까요?

 

 
  데이터 예시.PNG
다운로드 수 | 3
    
MYSAS 시샵   [2018/01/23 10:31]
안녕하세요:)

다음과 같이 올려주신 데이터 예시로 코드를 작성하였습니다.

data one;
input id $ code $;
cards;
100 A001
100 A003
100 B001
101 A001
102 B001
103 B002
104 B001
104 B002
;
run;


각각의 물품을 구매한 소비자는 PROC SQL의 COUNT 함수를 사용할 수 있습니다.
* A001/ B001 구매한 소비자;
proc sql;
create table two as
select code count(id)
from one
group by code;
quit;

두 물품 모두를 구매한 소비자는 두 물품을 구매했다면 YN으로 새로운 변수를 생성하여 1의 값을 줍니다.
YN의 합이 2가 되는 ID를 찾아내는 방법으로 코드를 작성하였습니다.
그러나 하나의 ID가 A001을 두 번 B001을 두 번 구매하는 경우도 존재할 수 있기 때문에
PROC SORT 프로시저의 NODUPKEY로 ID와 CODE가 중복되는 경우는 제거해주시는게 좋습니다.

* A001과 B001을 둘다 구매한 소비자;
proc sort data=one1 nodupkey;
by id code;
run;
data one1;
set one;
if code in ('A001' 'B001') then yn=1;
run;
proc sql;
create table three as
select id sum(yn) as sum
from one1
group by id
having sum=2 ;
quit;
proc print; run;
조상균   [2018/01/29 4:11]
답변 감사드립니다!!! 도움이 되었습니다!
 
 Data step내에서 매크로 변수 설정 및 사용
 서버 연결 오류 확인 부탁 드립니다.