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

 

Working on an assignment and i keep getting an error message.

 

data scores3;
infile datalines delimiter= '/' dsd;

input StudentID $ Quiz1 Quiz2 Quiz3 Quiz4 Midterm Project Final;

CourseAvg = .1Quiz1 + .1Quiz2 + .1Quiz3 + .1Quiz4 + .2midterm + .2project + .2final;
datalines;
JK/89/100/88/91/100/87/87
DS/100/95/97/69/100/88/85
SR/100/84/98/69/0/./89
RL/99/0/94/0/100/77/55
MZ/100/100/92/97/100/100/98
BB/88/./80/52/100/78/76
AC/100/100/100/98/100/100/98
;
run;

proc print data=scores3;
var StudentID CourseAvg;
run;

 

the above code keeps coming back with an error message and I dont understand what the error in my code is. 

 

61 CourseAvg = .1Quiz1 + .1Quiz2 + .1Quiz3 + .1Quiz4 + .2midterm + .2project + .2final;
_____ _____ _____ _____ _______
22 22 22 22 22
61 CourseAvg = .1Quiz1 + .1Quiz2 + .1Quiz3 + .1Quiz4 + .2midterm + .2project + .2final;
_______
22
ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, *, **, +, -, /, ;, <, <=, <>, =, >, ><, >=, AND, EQ, GE, GT,
LE, LT, MAX, MIN, NE, NG, NL, OR, ^=, |, ||, ~=.
 
61 CourseAvg = .1Quiz1 + .1Quiz2 + .1Quiz3 + .1Quiz4 + .2midterm + .2project + .2final;
_____
22
ERROR 22-322: Syntax error, expecting one of the following: !, !!, &, *, **, +, -, /, <, <=, <>, =, >, ><, >=, AND, EQ, GE, GT, IN,
LE, LT, MAX, MIN, NE, NG, NL, NOTIN, OR, ^=, |, ||, ~=.
 
62 datalines;
 
NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.SCORES3 may be incomplete. When this step was stopped there were 0 observations and 9 variables.
WARNING: Data set WORK.SCORES3 was not replaced because this step was stopped.
NOTE: DATA statement used (Total process time):
real time 0.08 seconds
cpu time 0.07 seconds
 
these are the warning and error messages recieved after inputing the code.
I really dont understand the error in my  code. if someone could help that would be greatl appreciated.
 
1 ACCEPTED SOLUTION

Accepted Solutions
mohamed_zaki
Barite | Level 11

@MadQuidd wrote:

 

CourseAvg = .1Quiz1 + .1Quiz2 + .1Quiz3 + .1Quiz4 + .2midterm + .2project + .2final;

 

 

You have two problem in this statment

- Where is the multiplication sign between numbers

- As you have Missing values you better use the SUM() function as it add missing. Not like the +

 

CourseAvg = sum(.1*Quiz1 , .1*Quiz2 ,.1*Quiz3 , .1*Quiz4 , .2*midterm , .2*project , .2*final);

 

 

 

View solution in original post

4 REPLIES 4
mohamed_zaki
Barite | Level 11

@MadQuidd wrote:

 

CourseAvg = .1Quiz1 + .1Quiz2 + .1Quiz3 + .1Quiz4 + .2midterm + .2project + .2final;

 

 

You have two problem in this statment

- Where is the multiplication sign between numbers

- As you have Missing values you better use the SUM() function as it add missing. Not like the +

 

CourseAvg = sum(.1*Quiz1 , .1*Quiz2 ,.1*Quiz3 , .1*Quiz4 , .2*midterm , .2*project , .2*final);

 

 

 

RyanSimmons
Pyrite | Level 9

To build on what mohamed said, with this line:

 

CourseAvg = .1Quiz1 + .1Quiz2 + .1Quiz3 + .1Quiz4 + .2midterm + .2project + .2final;

 

You are telling SAS to look for a variable called ".1Quiz1", a variable called ".1Quiz2", etc. These are not valid variable names in SAS (which must begin with an English letter or underscore). You need to tell SAS that you are applying a mathematical operation to the variable Quiz1, namely that you want to multiply it by 0.1 (and so on).

mohamed_zaki
Barite | Level 11

Kindly, if you got answers to your questions. Close the thread, by choosing one of the replies as "Accepted Answer".

 

 

FreelanceReinh
Jade | Level 19

One more remark (although the thread has been "closed" already ...):

 

If variable CourseAvg may be used for further processing (e.g. "if CourseAvg>30 then ...") I would strongly recommend to round it to a suitable number of decimals in order to avoid (!) rounding errors (due to numeric representation issues).

 

Simplified example:

 

data test;
input id quiz1-quiz3;
cards;
1 35 31 29
2 50 20 30
3 82 53 16
;

data eval;
set test;
avg=sum(.1*Quiz1, .2*Quiz2, .7*Quiz3); /* Risky! No rounding! */
length result $10;
     if avg>30 then result='Pass';
else if avg<30 then result='Fail';
else if avg=30 then result='Borderline';
run;

proc print data=eval noobs;
format avg best32.;
run;

Output:

id    quiz1    quiz2    quiz3                                 avg    result

 1      35       31       29                                   30    Fail
 2      50       20       30                                   30    Borderline
 3      82       53       16                                   30    Pass

As you can see, the three fictitious students are assigned three different results. However, their AVG scores should be exactly equal to 30 in all three cases (simple calculation, e.g. 8.2+10.6+11.2=30 for ID=3) and, indeed, this is what PROC PRINT shows, even with a very long display format such as BEST32..

 

The RESULT values of students 1 and 3 are incorrect due to tiny rounding errors from the calculation of AVG, which lead to slight deviations from the mathematically correct results (AVG=30): For the computer, ID 1 has AVG=29.999999999999996447... (hence <30) and ID 3 has AVG=30.000000000000003552... (hence >30).

 

This severe issue (student 1 could file a lawsuit!) could be avoided easily by defining

avg=round(sum(.1*Quiz1, .2*Quiz2, .7*Quiz3), 1e-9);

The small rounding unit (one billionth) is sufficient to flatten the rounding errors (of size 3.55E-15) and would not distort the results either, even if Quiz1-Quiz3 were not integers, but had, say, three decimals.

 

 

 

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

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
  • 4 replies
  • 865 views
  • 1 like
  • 4 in conversation