If I understood your post correctly, the logic below should accomplish what you are looking for with your code: /*********************/
/** SAMPLE DATASET **/
/*********************/
DATA have;
FORMAT sPatientID 8. dxCd $3.;
INFORMAT sPatientID 8. dxCd $3.;
INPUT sPatientID dxCd;
CARDS;
1 I21
1 E53
1 I22
1 I50
2 B43
2 C87
2 I52
2 I51
;
PROC SORT DATA=WORK.Have; BY sPatientID; RUN;
DATA WORK.Want (DROP=CC_GRP1 CC_GRP2);
SET WORK.Have;
BY sPatientID;
RETAIN CC_GRP1
CC_GRP2;
IF FIRST.sPatientID THEN DO;
Charlson_score=0;
CC_GRP1=0;
CC_GRP2=0;
END;
IF dxCd IN: ("I21","I22","I23","I24") THEN CC_GRP1=1;
ELSE IF dxCd IN: ("I43","I50","I51","I52") THEN CC_GRP2=1;
IF LAST.sPatientID THEN DO;
Charlson_score=(CC_GRP1)*2 + (CC_GRP2)*3;
OUTPUT;
END;
RUN; This is the output that was produced using my sample dataset: sPatientID dxCd Charlson_score
1 I50 5
2 I51 3 Hope this helps.
... View more