08-25-2015 06:53 PM
I am producing a report on student's grades- how many start a Math or English course (Cohort=1), how many complete it (COMP) and how many have success (PASS). I thought that the section of code below would create the variable 'PASS' with a value of 1 for each occurrence of grades A, B, C and S and create a variable 'COMP' with a value of 1 for every student who finished a course .
Rather than list all the grades that constitute completion, I thought that I could use the 'not equal' condition for the grades that indicate non-completion and create a positive counter for students who last to the bitter end. This code does create the correct PASS values; BUT even though there are students that have grades of 'I', 'NC, and "W", all 10K+ students in the cohort have a 'COMP' variable with a value of 1. If I use one grade, i.e., If GRADE~=W" then COMP=1, all students with a 'W' grade have a COMP value of 0 and do not appear in the QUAPROPTER subset.
So what an I doing wrong? I would bet my ex's alimony that I have used this combination before.
IF TERM=>&COHO_TERM AND CRSE_NO>100 AND (COURSENAME='MAT' OR COURSENAME='ENG');
IF (GRADE='A' OR GRADE='B' OR GRADE='C' OR GRADE='S') THEN PASS=1; /*SET PASS VAR*/
IF ( GRADE~='I' OR GRADE~='NC' OR GRADE~='W' ) THEN COMP=1; /*SET COMPELETION VAR*/
array a(*) _numeric_;
do i=1 to dim(a);
if a(i) = . then a(i) = 0;
KEEP SSN TERM COURSE CRSE_NO COURSENAME GRADE GOT COMPLETE PASS;
DATA QUAPROPTER;/*test if the code works*/
PROC FREQ; TABLES COHO PASS COMP GRADE;
08-25-2015 07:03 PM
Basic logic table negation of an or becomes AND
GRADE~='I' and GRADE~='NC' and GRADE~='W'
Try this for easier to read and maintain code:
if grade in ('A', 'B','C', 'S') then pass=1;
if grade not in ('I', 'NC', 'W') then comp = 1;
08-26-2015 08:59 AM
This condition ( GRADE~='I' OR GRADE~='NC' OR GRADE~='W' ) is always true.
The logic issue is easy to see if you just pick a specific value of GRADE and see what happens.
If GRADE is not I , NC or W then it is obviously true since all three sub conditions are true.
But if GRADE = 'I' then (GRADE~='I') is FALSE but the other two conditions are true so the overall condition is TRUE.
Similarly for NC or W.
Need further help from the community? Please ask a new question.