* 출처 : http://mysas.co.kr/sas_club/a_nowhow.asp?b_no=1606&cmd=content&bd_no=1
[ 질문 ]
안녕하세요. 저는 대학원 학위논문을 쓰고있는 대학원생입니다.
도움주시면 감사하겠습니다
***********************************************************
[답변]
원하는 답이 맞는지 모르겠지만,
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;
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.