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;
Don't miss out on SAS Innovate - Register now for the FREE Livestream!
Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.
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.