BookmarkSubscribeRSS Feed
thackkr
Fluorite | Level 6

VERY new SAS user here 🙂  I'm looking for a way to tell SAS to display table values in the order in which I hard coded them.  For example, I created a subset of an existing data set and recoded education level categorical data like this: 

 

if _EDUCAG = 1 then educat = "No HS Diploma";

if _EDUCAG = 2 then educat = "HS Diploma";

if _EDUCAG = 3 then educat = "Some College";

if _EDUCAG = 4 then educat = "College Grad";

if _EDUCAG = 9 then educat = "Don't Know";

 

When I use proc freq to create frequency and crosstabulation tables, I'd like to know if there is a way to include an ORDER= statement that will display the table data in the order in which I created it (e.g., List "No HS Diploma" first, "HS Diploma" next, etc.). It looks like the default is to list the categories alphabetically.

 

Thank you!

5 REPLIES 5
r_behata
Barite | Level 11

Try Formats :

 

proc format;
	value educat 1="No HS Diploma"
				2="HS Diploma"
				3="Some College"
				4="College Grad"
				9="Don't Know";
run;


data have;
	do _EDUCAG =1,2,3,4,9;
		output;
	end;
run;


proc freq data=have;
	tables _EDUCAG / missing;

	format _EDUCAG educat.;
run; 
thackkr
Fluorite | Level 6

Thank you so much for the suggestion!  A co-worker suggested I look at formats, too.  I'm guessing this means there is no simple way to do it without proc format then?  Thank you!

braam
Quartz | Level 8

What about this? When hard-coding, you may want to consider index.

 


proc freq data=sashelp.cars;
	where make in ("Acura" "Audi" "BMW");
	tables make;run; 

	data temp; set sashelp.cars;
		if make= "BMW" then NewMake= "1. BMW";
		if make= "Audi" then NewMake= "2. Audi";
		if make= "Acura" then NewMake= "3. Third";
		run;
proc freq data= temp;
	tables NewMake ;run; 
thackkr
Fluorite | Level 6

Hadn't thought of that!  Thanks so much for the suggestion 🙂

ballardw
Super User

@thackkr wrote:

Thank you so much for the suggestion!  A co-worker suggested I look at formats, too.  I'm guessing this means there is no simple way to do it without proc format then?  Thank you!


Sort and use ORDER=Data option:

data example;
   do i= 1 to 100;
      _educag = rand('integer',1,5);
      if _educag=5 then _educag=9;
      if _EDUCAG = 1 then educat = "No HS Diploma";
      if _EDUCAG = 2 then educat = "HS Diploma";
      if _EDUCAG = 3 then educat = "Some College";
      if _EDUCAG = 4 then educat = "College Grad";
      if _EDUCAG = 9 then educat = "Don't Know";
      output;
   end;
run;

proc sort data=example;
  by _educag;
run;

proc freq data=example order=data;
   tables educat;
run;

However, if you want to summarize many variables at once it is very unlikely that a sort order would be correct for more than one variable.

 

IMHO the Format approach is likely the most flexible in the long run. All you need to get a summary of No HS diploma, HS or college and Don't Know is a new format. No additional variables added Also the groups created by formats will generally be used by any analysis or graphing procedure.

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
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
  • 5 replies
  • 825 views
  • 4 likes
  • 4 in conversation