data baseball4;
set work.baseball;
array NumVar _numeric_;
do over NumVar;
if NumVar=. then NumVar=0;
end;
format AVG 6.3;
format SLG 6.3;
MIN=SALARY< 500000;
MAX=SALARY<=10000000;
OBP=H+HBP/PA;
format OBP 6.3;
ISO=SLG-AVG;
format ISO 6.3;
SP=SO/PA;
format SP percent7.1;
BA=H/AB;
format BA 6.3;
IF SALARY >=MAX THEN Salary_Description='Filthy Rich';
ELSE Salary_Description='none';
if SALARY < MIN then sal_type ='Less than League Minimum';
/* ELSE if SALARY >= MIN then sal_type='Filthy Rich'; */
ELSE sal_type='middle';
run;
Hi, I'm not getting any errors in my code, but can someone look at the attached assignment and let me know if there is a better or more efficient way to write this according to the assignment criteria. Thanks, much appreciated!
What about:
/* half a million or less */
min= (salary <= 500000);
/* at least 10 million */
max= (salary >= 10000000);
Now the way you've coded the variables MIN and MAX will have the values 1 or 0. You basically have right from the first equal sign a logical comparison which either returns True or False (which gives you the values 1 or 0.
Now have a look what you've done here:
IF SALARY >=MAX THEN Salary_Description='Filthy Rich';
That will give you a wrong result. It should be:
IF MAX THEN Salary_Description='Filthy Rich'; or alternatively: IF MAX=1 THEN Salary_Description='Filthy Rich';
Also:
When you have a statement like below...
IF SALARY >=MAX THEN Salary_Description='Filthy Rich';
...using a variable which hasn't been defined before then be aware that SAS will assign this variable the length of the string you're assigning. What this means: If you then later on in your code have another such assignment where you try to assign a longer string then this string will get truncated. To avoid this: Always define the length of new variables explicitly before you use it using a length statement.
length Salary_Description $40; Salary_Description='Filthy Rich'
And last but not least and not what you're asked to do in your assignment but something I guess this assignment is meant to achieve as a learning experience to prepare you for the next lesson: An efficient way for recoding or grouping which avoids creating all these additional variables is using SAS Formats and Informats.
proc format;
value salaryRangeDesc
low - 500000 = 'Less than League Minimum'
10000000 - high = 'Filthy Rich'
other = 'None'
;
quit;
data sample;
do salary= .,0,499999,500000,500001,09999999,10000000,10000001;
Salary_Description=put(salary,salaryRangeDesc.);
output;
end;
stop;
run;
proc print data=sample;
run;
@philjones820 wrote:
data baseball4; set work.baseball; array NumVar _numeric_; do over NumVar; if NumVar=. then NumVar=0; end; format AVG 6.3; format SLG 6.3; MIN=SALARY< 500000; MAX=SALARY<=10000000; OBP=H+HBP/PA; format OBP 6.3; ISO=SLG-AVG; format ISO 6.3; SP=SO/PA; format SP percent7.1; BA=H/AB; format BA 6.3; IF SALARY >=MAX THEN Salary_Description='Filthy Rich'; ELSE Salary_Description='none'; if SALARY < MIN then sal_type ='Less than League Minimum'; /* ELSE if SALARY >= MIN then sal_type='Filthy Rich'; */ ELSE sal_type='middle'; run;
Hi, I'm not getting any errors in my code, but can someone look at the attached assignment and let me know if there is a better or more efficient way to write this according to the assignment criteria. Thanks, much appreciated!
Don’t you need to calculate the min/max?
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.