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
array F[5] _temporary_ (65, 70, 60, 62, 68);
array P
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;
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
array F[5] _temporary_ (65, 70, 60, 62, 68);
array P
array T
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);
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.
Please help.
Thank you
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
array F[5] _temporary_ (65, 70, 60, 62, 68);
array P
array T
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;
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
array F[5] _temporary_ (65, 70, 60, 62, 68);
array P
array T
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;
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 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;
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.