Help using Base SAS procedures

Negative if or then statements. What am I not seeing ?

Accepted Solution Solved
Reply
Occasional Contributor
Posts: 13
Accepted Solution

Negative if or then statements. What am I not seeing ?

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.

Thanks

F9_GRADES;

               SET IA.CERSGRADES;

          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*/
          cohort=1

array a(*) _numeric_;

do i=1 to dim(a);

if a(i) = . then a(i) = 0;

end;

drop I;
KEEP SSN TERM COURSE CRSE_NO COURSENAME GRADE GOT COMPLETE PASS;


DATA  QUAPROPTER;/*test if the code works*/

     SET F9_GRADES;

               IF COMPLETE=1;

               PROC FREQ; TABLES COHO PASS COMP GRADE;

RUN;;



Accepted Solutions
Solution
‎08-25-2015 09:52 PM
Occasional Contributor
Posts: 13

Re: Negative if or then statements. What am I not seeing ?

Thanks.  The easier way works.  I ma going to have mull over the logic issue though..

View solution in original post


All Replies
Super User
Posts: 10,500

Re: Negative if or then statements. What am I not seeing ?

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;

Solution
‎08-25-2015 09:52 PM
Occasional Contributor
Posts: 13

Re: Negative if or then statements. What am I not seeing ?

Thanks.  The easier way works.  I ma going to have mull over the logic issue though..

Super User
Super User
Posts: 6,500

Re: Negative if or then statements. What am I not seeing ?

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.

☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

Discussion stats
  • 3 replies
  • 297 views
  • 0 likes
  • 3 in conversation