Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 3

SAS Programming by Example [8]

Chapter 8 RETAIN "Remembering" Values from Previous Observations


Example 1 Creating a Subject Number in the DATA Step: A Common Mistake Feature: Assignment Statement ******* INCORRECT PROGRAM *******; DATA NOGOOD; SUBJECT=SUBJECT+1; INPUT SCORE1 SCORE2; DATALINES; 34 56 78 ; PROC PRINT DATA=NOGOOD; TITLE1 "Incorrect Program"; RUN; Example 2 Creating a Subject Number in the DATA Step Using RETAIN Feature: RETAIN Statement DATA BETTER; RETAIN SUBJECT 0; SUBJECT=SUBJECT + 1; INPUT SCORE1 SCORE2; DATALINES; 34 56 78 ; PROC PRINT DATA=BETTER; TITLE1 "Correct Program"; RUN; Example 3 Explicit versus Implicit Retaining of Values Feature: SUM Statement DATA BEST; SUBJECT+1; INPUT SCORE1 SCORE2; DATALINES; 34 56 78

; PROC PRINT DATA=BEST; TITLE1 "Correct Program"; RUN; Example 4 Scoring a Multiple-Choice Test Using RETAIN Features: RETAIN, ARRAY, DELETE, and KEEP Statements, SUM Function, _N_ Variable DATA SCORING; ARRAY KEY [5] $ 1 KEY1-KEY5; * ANSWER KEY ; ARRAY ANS [5] $ 1 ANS1-ANS5; * STUDENT RESPONSES ; ARRAY SCORE [5] SCORE1-SCORE5; * ITEM SCORES; * 1=CORRECT; * 0=WRONG ; RETAIN KEY1-KEY5; IF _N_=1 THEN DO; INPUT (KEY1-KEY5) ($1.); DELETE; END; ELSE DO; INPUT (ANS1-ANS5) ($1.); DO I=1 TO 5; IF KEY [I] =ANS [I] THEN SCORE [I] =1; ELSE SCORE [I] =0; END; RAW=SUM (OF SCORE1-SCORE5); PERCENT= (100*RAW)/5; END; KEEP RAW PERCENT; DATALINES; ABCDE ABABA ABCDA ; PROC PRINT DATA=SCORING; TITLE1 "Scoring a Test"; RUN; Note: RETAIN KEY1-KEY5 values in the program data vector (PVD) DELETE statement instructs the program not to write out the First observation (_N_=1) RAW=SUM (OF SCORE1-SCORE5); SCORE [I] = (KEY [I] =ANS [I]); SCORE [I] IS EITHER 1 OR 0 Example 5 Using Caution When Coding with RETAIN Feature: RETAIN Statement File HTWT SUBJ DOB WEIGHT 1 10/21/66 155 1 158

1 162 2 11/01/46 102 2 108 2 105 3 200 3 202 3 154 DATA DANGER; RETAIN OLD_DOB; INFILE 'HTWT'; INPUT @1 SUBJ $2. @7 DOB MMDDYY8. @17 WEIGHTS 3; IF DOB NE. THEN OLD_DOB=DOB; ELSE DOB=OLD_DOB; FORMAT DOB MMDDYY8; DROP OLD_DOB; RUN; Example 6 Checking for a New Subject Number Using a LAG Function Features: RETAIN Statement, LAG Function DATA WORKS; RETAIN OLD_DOB; INFILE 'HTWT'; INPUT @1 SUBJ $2. @7 DOB MMDDYY8. @17 WEIGHTS 3; IF SUBJ NE LAG (SUBJ) THEN OLD_DOB=DOB; ELSE DOB=OLD_DOB; FORMAT DOB MMDDYY8; DROP OLD_DOB; RUN; Example 7 Checking for a NEW Subject Number Using a LAG Function and A Trailing Features: RETAIN Statement, LAG Function, Trailing DATA COMPULSE; RETAIN DOB; INFILE 'HTWT'; INPUT @1 SUBJ $2. @; IF SUBJ NE LAG (SUBJ) THEN INPUT @7 DOB MMDDYY8. @17 WEIGHTS 3; ELSE INPUT @17 WEIGHT 3; FORMAT DOB MMDDYY8; RUN;

You might also like