BookmarkSubscribeRSS Feed

[SAS 프로그래밍 고수 백승민] [PROC SQL] 에서 IFC IFN 활용

Started ‎06-11-2020 by
Modified ‎06-12-2020 by
Views 111

* 출처 : http://mysas.co.kr/sas_club/a_nowhow.asp?b_no=1606&cmd=content&bd_no=1

 

[ 질문 ]

 

안녕하세요. 저는 대학원 학위논문을 쓰고있는 대학원생입니다.

조사구번호, 주거번호, 가구번호가 동일하면서 응답자와 응답자의 배우자에게 자녀수와 막내자녀의 나이의 데이터를 생성시키는 방법을 몰라 궁리끝에 문의드립니다.
[PROC SQL] 에서 IFC IFN 활용.png
 
 

도움주시면 감사하겠습니다

 

 

 

***********************************************************

[답변]

 

원하는 답이 맞는지 모르겠지만,

1. 자녀의 수를 카운트

2. 막내 나이 계산

3. 위 두 값을 원 데이터에 조인하였습니다.

DATA step으로 구현하시려면, Proc summary 에서 N 과 Max 값을 구하신 후에 MERGE하시면 될듯합니다.

 

data BACK;
input var1 : $10. (var2 - var16 ) (: $4.);
cards;
A044029901  1 1 2 A044  2 99 1 1 4 21 1 51 1 1 20
A044029902  1 1 2 A044  2 99 2 1 4 21 2 46 1 1 10
A044029903  1 1 2 A044  2 99 3 1 4 21 2 25 2 8 11
A044029904  1 1 2 A044  2 99 4 3 4 21 2 7 2 8 12
A044030101  1 1 2 A044  3 1 1 1 5 32 1 54 1 1 20
A044030102  1 1 2 A044  3 1 2 1 5 32 2 49 1 1 10
A044030103  1 1 2 A044  3 1 3 1 5 32 2 22 2 8 11
A044030104  1 1 2 A044  3 1 4 1 5 32 2 21 2 8 12
;

PROC SQL;
  CREATE TABLE BACK1 AS
    SELECT A.*,
           IFN(CNT1=.,0,CNT1) AS CNT1,
           IFC(LAST_AGE='','0',LAST_AGE) AS LAST_AGE LENGTH=3
    FROM   BACK A
           LEFT JOIN ( SELECT VAR5,
                              VAR6,
                              VAR7,
                              COUNT(*) AS CNT1
                       FROM   BACK
                       WHERE  VAR16 NOT IN ('10','20')
                       GROUP BY 1,2,3
                      ) B
                ON  A.VAR5 = B.VAR5
                AND A.VAR6 = B.VAR6
                AND A.VAR7 = B.VAR7
                AND A.VAR16 IN ('10','20')
           LEFT JOIN ( SELECT A.VAR5,
                              A.VAR6,
                              A.VAR7,
                              VAR13 AS LAST_AGE
                       FROM   BACK A
                       WHERE  VAR16 NOT IN ('10','20')
                         AND  A.VAR16 = ( SELECT MAX(B.VAR16)
                                          FROM   BACK B
                                          WHERE A.VAR5 = B.VAR5
                                            AND A.VAR6 = B.VAR6
                                            AND A.VAR7 = B.VAR7
                                            AND B.VAR16 NOT IN ('10','20')
                                         )
                      ) C
                ON  A.VAR5 = C.VAR5
                AND A.VAR6 = C.VAR6
                AND A.VAR7 = C.VAR7
                AND A.VAR16 IN ('10','20');
QUIT;

Version history
Last update:
‎06-12-2020 03:08 AM
Updated by:
Contributors

sas-innovate-white.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.

 

Early bird rate extended! Save $200 when you sign up by March 31.

Register now!

Article Labels
Article Tags