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 ;
|
Navigation
|