BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
dustychair
Pyrite | Level 9

Hello,

I have a data set which has 1000 students, the test length is 100 and I want to score them. If student's answer equal to the key then score will be 1 else 0. I can do that for each student 100 hundred time with if else statement but I believe there is an easy way to do that. Maybe with a loop? Actually even simple code below did not work. What am I missing? i'll appreciate for any help. 

 

data key;
infile 'C:\cluster_new\key.txt';
input m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12 m13 m14 m15 m16 m17 m18 m19 m20 m21 m22 m23 m24 m25 m26 m27 m28 m29 m30 m31 m32 m33 m34 m35 m36 m37 m38 m39 m40
m41 m42 m43 m44 m45 m46 m47 m48 m49 m50 m51 m52 m53 m54 m55 m56 m57 m58 m59 m60 m61 m62 m63 m64 m65 m66 m67 m68 m69 m70 m71 m72 m73 m74 m75 m76 m77 m78 m79 m80
m81 m82 m83 m84 m85 m86 m87 m88 m89 m90 m91 m92 m93 m94 m95 m96 m97 m98 m99 m100;
run;
data responses;
infile 'C:\cluster_new\data.txt';
input id_p $ r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 r32 r33 r34 r35 r36 r37 r38 r39 r40
r41 r42 r43 r44 r45 r46 r47 r48 r49 r50 r51 r52 r53 r54 r55 r56 r57 r58 r59 r60 r61 r62 r63 r64 r65 r66 r67 r68 r69 r70 r71 r72 r73 r74 r75 r76 r77 r78 r79 r80
r81 r82 r83 r84 r85 r86 r87 r88 r89 r90 r91 r92 r93 r94 r95 r96 r97 r98 r99 r100;
run;

 

data scoring;
set responses;
if m1=r1 then r1=1; else r1=0;
run;

Thanks

1 ACCEPTED SOLUTION

Accepted Solutions
Kurt_Bremser
Super User

The data step needed a modification, since no merge with a by is used:

data scoring (keep=id_p score:);
set responses;
if _n_ = 1 then set key;
array m {*} m1-m100;
array r {*} r1-r100;
array scores {*} score1-score100;
do i = 1 to 100;
  scores{i} = (m{i} = r{i});
end;
run;

View solution in original post

11 REPLIES 11
Reeza
Super User

You want an array. I would recommend using three arrays.

  • a temporary one for your answers, since it won’t change
  • one for the responses
  • one for the scores

 

This structure allows you to just sum the scores at the end. 

 

Heres a tutorial on arrays. 

https://stats.idre.ucla.edu/sas/seminars/sas-arrays/

 


@dustychair wrote:

Hello,

I have a data set which has 1000 students, the test length is 100 and I want to score them. If student's answer equal to the key then score will be 1 else 0. I can do that for each student 100 hundred time with if else statement but I believe there is an easy way to do that. Maybe with a loop? Actually even simple code below did not work. What am I missing? i'll appreciate for any help. 

 

data key;
infile 'C:\cluster_new\key.txt';
input m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11 m12 m13 m14 m15 m16 m17 m18 m19 m20 m21 m22 m23 m24 m25 m26 m27 m28 m29 m30 m31 m32 m33 m34 m35 m36 m37 m38 m39 m40
m41 m42 m43 m44 m45 m46 m47 m48 m49 m50 m51 m52 m53 m54 m55 m56 m57 m58 m59 m60 m61 m62 m63 m64 m65 m66 m67 m68 m69 m70 m71 m72 m73 m74 m75 m76 m77 m78 m79 m80
m81 m82 m83 m84 m85 m86 m87 m88 m89 m90 m91 m92 m93 m94 m95 m96 m97 m98 m99 m100;
run;
data responses;
infile 'C:\cluster_new\data.txt';
input id_p $ r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 r32 r33 r34 r35 r36 r37 r38 r39 r40
r41 r42 r43 r44 r45 r46 r47 r48 r49 r50 r51 r52 r53 r54 r55 r56 r57 r58 r59 r60 r61 r62 r63 r64 r65 r66 r67 r68 r69 r70 r71 r72 r73 r74 r75 r76 r77 r78 r79 r80
r81 r82 r83 r84 r85 r86 r87 r88 r89 r90 r91 r92 r93 r94 r95 r96 r97 r98 r99 r100;
run;

 

data scoring;
set responses;
if m1=r1 then r1=1; else r1=0;
run;

Thanks


 

dustychair
Pyrite | Level 9

Hi Reeza,

Thanks for your response. I'm a very beginner SAS programmer. So, sorry for silly questions. Do you mean something like that? I did not get any error but the responses are still the same not binary.


data scoring;
set responses;
array aresponses(100) r1-r100;
array akey[100] _temporary_ ;
array ascores(100) as1-as100;
do i=1 to 100;
if aresponses[i]= akey[i] then ascores[i]=1;
end;
drop i;
run;

error_prone
Barite | Level 11
The arrays need to have the same number of elements for the step to work.
dustychair
Pyrite | Level 9

image.pngt

Kurt_Bremser
Super User

In your original code:

data scoring;
set responses;
if m1=r1 then r1=1; else r1=0;
run;

you try to use m1, which is not present in dataset responses; since it is present in dataset key, I guess you wanted to merge those datasets. Use arrays and a do loop for the repeating task of comparing responses:

data scoring (keep=id score:);
merge
  responses
  key
;
array m {*} m1-m100;
array r {*} r1-r100;
array scores {*} score1-score100;
do i = 1 to 100;
  scores{i} = (m{i} = r{i});
end;
run;

 

dustychair
Pyrite | Level 9

Hi KurtBremser,

Thank your for your response. Since there are 1000 students I did 1000 in the array. This code is much better then mine however it changed only first row of the responses correctly,rest of the data is zero. 

Thanks

Kurt_Bremser
Super User

Please provide example data against which we can test code. Simply provide the two .txt files so we can read them in with the data steps.

The size of the array has nothing to do with the number of students, but with the number of keys and responses. The number of students is just a matter of rows to process, if I read your data structure correctly.

dustychair
Pyrite | Level 9

Hi,

I am really a very beginner programmer. I have been learning many things through this forum. So, sorry for silly questions. Data and key are attached.

Thanks

Kurt_Bremser
Super User

The data step needed a modification, since no merge with a by is used:

data scoring (keep=id_p score:);
set responses;
if _n_ = 1 then set key;
array m {*} m1-m100;
array r {*} r1-r100;
array scores {*} score1-score100;
do i = 1 to 100;
  scores{i} = (m{i} = r{i});
end;
run;
dustychair
Pyrite | Level 9

Awesome! Many thanks!

sas-innovate-2024.png

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.

 

Register now!

How to Concatenate Values

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 11 replies
  • 1197 views
  • 2 likes
  • 4 in conversation