Separating pretest scores from posttest scores Chong Ho Yu, Ph.D.

Problem

There is a data file carrying both pretest and posttest scores in the same field. However, no column is used to indicate which entry is from the pretest and which one is from the posttest. What I know is that when there are two rows belonging to the same ID, the first row is the pretest datum. I would like to separate the pretest scores from the posttest scores. What can I do?

Pretest and posttest scores

 ID scores 12345 80 12345 100 45678 85 45678 90 99999 98 99999 100

Pretest and posttest
scores Rank

 ID scores rank 12345 80 1 12345 100 2 45678 85 3 45678 90 4 99999 98 5 99999 100 6
Solution

The following SAS code is not the most efficient one, but it works. The logic is as follows: Every subject has two entries and the first one in each pair is the pretest. In this case, the rank order number of each pretest record is always an odd number: 1, 3, 5, 7, 9. By the same token, that of each posttest record is always an even number: 2, 4, 6, 8, 10. The following code utilize this pattern for separation. Please read the comments (text in green) for the step-by-step illustration.

 SAS program for separating pretest and posttest scores /* assume that the data file has been imported and is named 'one' */ data two; set one; /* set the order of the observation as the temporary ID and concatenate it with the character "S" */ temp = _N_ || "S" ; /* search for any observation that ends with an odd number. The letter "S" forces SAS to look at the end only */ if index (temp, "1S") then flag = 1; if index (temp, "3S") then flag = 1; if index (temp, "5S") then flag = 1; if index (temp, "7S") then flag = 1; if index (temp, "9S") then flag = 1; /* separate pretest scores from posttest scores by flag */ if flag = 1 then test = "pretest "; else if flag = . then test = "posttest"; run;