## RETAIN ARRAY statements

Occasional Contributor
Posts: 12

# RETAIN ARRAY statements

Please help me create 5 new variables ToTPass1 ~ ToTPass5 by using RETAIN and ARRAY statements to generate cumulative values in variables Pass1 to Pass5, respectively.

data psych;

input ID \$3. Ques1-Ques10 Score1-Score5;

array S

• Score1 - Score5;
•     array F[5] _temporary_ (65, 70, 60, 62, 68);

array P

• Pass1 - Pass5;
•     do i = 1 to dim(S);

P = (S >= F);

end;

output;

datalines;

001 1 3 2 4 5 4 3 4 5 4 90 88 92 95 90

002 3 3 . . 3 4 5 5 1 . 64 64 77 72 71

003 . . . . 5 5 4 4 3 3 68 69 80 75 70

004 5 3 4 5 . 5 4 3 3 . 88 77 66 77 67

005 5 4 3 2 1 1 2 3 4 5 92 93 94 95 99

006 4 5 1 3 2 5 3 1 1 1 55 65 71 85 91

007 3 2 2 1 5 4 5 3 2 2 60 70 88 79 82

008 2 1 1 5 5 4 4 2 1 3 65 87 90 60 55

009 1 1 1 3 2 2 3 5 4 4 71 81 91 77 88

010 2 3 3 4 1 5 2 2 3 1 64 69 61 70 70

;

proc print data = psych;

run;

Super Contributor
Posts: 320

## Re: RETAIN ARRAY statements

Again, the question is not understood. I guess you want the (0,1) are to be added in each ROW. If so, it is simple. If you want both Pass1 - Pass5 along with TotPass1 - TotPass5 then use the following:

data psych;

input ID \$3. Ques1-Ques10 Score1-Score5;

array S

• Score1 - Score5;
•     array F[5] _temporary_ (65, 70, 60, 62, 68);

array P

• Pass1 - Pass5;
•      array T

• TotPass1 - TotPass5;
•     do i = 1 to dim(S);

P = (S >= F);

T + (S >= F);

end;

output;

datalines;

001 1 3 2 4 5 4 3 4 5 4 90 88 92 95 90

002 3 3 . . 3 4 5 5 1 . 64 64 77 72 71

003 . . . . 5 5 4 4 3 3 68 69 80 75 70

004 5 3 4 5 . 5 4 3 3 . 88 77 66 77 67

005 5 4 3 2 1 1 2 3 4 5 92 93 94 95 99

006 4 5 1 3 2 5 3 1 1 1 55 65 71 85 91

007 3 2 2 1 5 4 5 3 2 2 60 70 88 79 82

008 2 1 1 5 5 4 4 2 1 3 65 87 90 60 55

009 1 1 1 3 2 2 3 5 4 4 71 81 91 77 88

010 2 3 3 4 1 5 2 2 3 1 64 69 61 70 70

;

run;

if you want only, TotPass1 - TotPass5, you may delete the statement,

P = (S >= F);

Occasional Contributor
Posts: 12

## Re: RETAIN ARRAY statements

I;m sorry my question was not clear.

What I need to do in this new question is to create 5 new variables: ToTPass1 ~ ToTPass5, for this of course I will use the ARRAY statement.  In each variable, I need the CUMULATIVE sum of the previous values (example,  observation n has Pass1 = 1, Pass2 = 0 , Pass3 = 0, Pass4 = 1, Pass5 = 1, then this observation  will have TotPass1 = 1, TotPass2 = 1, TotPass3 = 1, TotPass4 = 2, TotPass5 = 3.).   For this step, I will need to use the RETAIN statement.

Thank you

Super Contributor
Posts: 320

## Re: RETAIN ARRAY statements

I suppose this is what you want. I don't any need to use RETAIN as array p[ ] holds the values for the previous row. Only

check is it should be done from the second row.

data psych;

input ID \$3. Ques1-Ques10 Score1-Score5;

array S

• Score1 - Score5;
•     array F[5] _temporary_ (65, 70, 60, 62, 68);

array P

• Pass1 - Pass5;
•      array T

• TotPass1 - TotPass5;
•     do i = 1 to dim(S);

P = (S >= F);

if i > 1 then

T + P;

end;

output;

datalines;

001 1 3 2 4 5 4 3 4 5 4 90 88 92 95 90

002 3 3 . . 3 4 5 5 1 . 64 64 77 72 71

003 . . . . 5 5 4 4 3 3 68 69 80 75 70

004 5 3 4 5 . 5 4 3 3 . 88 77 66 77 67

005 5 4 3 2 1 1 2 3 4 5 92 93 94 95 99

006 4 5 1 3 2 5 3 1 1 1 55 65 71 85 91

007 3 2 2 1 5 4 5 3 2 2 60 70 88 79 82

008 2 1 1 5 5 4 4 2 1 3 65 87 90 60 55

009 1 1 1 3 2 2 3 5 4 4 71 81 91 77 88

010 2 3 3 4 1 5 2 2 3 1 64 69 61 70 70

;

run;

proc print; run;

Super Contributor
Posts: 320

## Re: RETAIN ARRAY statements

I missed to compute the column totals in my previous Post. I am posting the revised code. This requires RETAIN statement.

data Need(drop = i);

input ID \$3. Ques1-Ques10 Score1-Score5;

array S

• Score1 - Score5;
•   array F[5] _temporary_ (65, 70, 60, 62, 68);

array P

• Pass1 - Pass5;
•   array T

• TotPass1 - TotPass5;
•   retain TotP:;

do i = 1 to dim(S);

P = (S >= F);

T + P;

end;

output;

datalines;

001 1 3 2 4 5 4 3 4 5 4 90 88 92 95 90

002 3 3 . . 3 4 5 5 1 . 64 64 77 72 71

003 . . . . 5 5 4 4 3 3 68 69 80 75 70

004 5 3 4 5 . 5 4 3 3 . 88 77 66 77 67

005 5 4 3 2 1 1 2 3 4 5 92 93 94 95 99

006 4 5 1 3 2 5 3 1 1 1 55 65 71 85 91

007 3 2 2 1 5 4 5 3 2 2 60 70 88 79 82

008 2 1 1 5 5 4 4 2 1 3 65 87 90 60 55

009 1 1 1 3 2 2 3 5 4 4 71 81 91 77 88

010 2 3 3 4 1 5 2 2 3 1 64 69 61 70 70

;

run;

Super User
Posts: 10,761

## Re: RETAIN ARRAY statements

### Code: Program

`data psych;  input ID \$3. Ques1-Ques10 Score1-Score5;  array S[*] Score1 - Score5;   array F[5] _temporary_ (65, 70, 60, 62, 68);   array P[*] Pass1 - Pass5;   sum=0;   do i = 1 to dim(S);   sum+(S[i] >= F[i]);   P[i] =sum;   end;      output;datalines;001 1 3 2 4 5 4 3 4 5 4 90 88 92 95 90002 3 3 . . 3 4 5 5 1 . 64 64 77 72 71003 . . . . 5 5 4 4 3 3 68 69 80 75 70004 5 3 4 5 . 5 4 3 3 . 88 77 66 77 67005 5 4 3 2 1 1 2 3 4 5 92 93 94 95 99006 4 5 1 3 2 5 3 1 1 1 55 65 71 85 91007 3 2 2 1 5 4 5 3 2 2 60 70 88 79 82008 2 1 1 5 5 4 4 2 1 3 65 87 90 60 55009 1 1 1 3 2 2 3 5 4 4 71 81 91 77 88010 2 3 3 4 1 5 2 2 3 1 64 69 61 70 70;run;`
Discussion stats
• 5 replies
• 448 views
• 6 likes
• 3 in conversation