Proc Summary in SAS: Explained

PROC SUMMARY in SAS procedures allows us to explore our data in terms of counts and distributions and statistically. 

Proc summary in SAS Example

For this article, we have taken the example datasets SASHELP.SHOES.

We can use the following code to calculate descriptive statistics for the sales variable:

proc summary data=sashelp.shoes;
var sales;
OUTPUT OUT=SUMDS;
run;
proc print data=sumds;
Proc Summary in SAS: Explained
Proc Summary in sas example

The VAR statement names the numeric variables to be analyzed. 

Here’s how to interpret the output table:

  • _TYPE_: This column shows whether or not every row in the dataset was used to calculate the descriptive statistics. 0 = Every row was used.
  • _FREQ_: The number of rows used to calculate each descriptive statistic.
  • _STAT_: The name of the descriptive statistic.
  • sales: The numerical value for the corresponding descriptive statistic.

Proc Summary with Multiple Variables

To get descriptive statistics for more than one variable simultaneously, just list the names of the variables in the var statement.

For example, to find the descriptive statistics for the Sales and returns variables, we can use the following code:

proc summary data=sashelp.shoes;
var sales returns;
OUTPUT OUT=SUMDS;
run;
proc print data=sumds;
Proc Summary in SAS: Explained
Proc Summary with Multiple Variables

Choose Statistics to Calculate

Most of the time, we don’t want all the default statistics in the SAS data set we’re creating. We can choose which statistics to show in the Output Statement of Proc Summary.

proc summary data=sashelp.shoes;
var sales returns;
OUTPUT OUT=SUMDS mean=mean sum=sum;
run;
proc print data=sumds;
Proc Summary in SAS: Explained
Choose Statistics to Calculate

Proc Summary by group

We can use the class statement to find descriptive statistics for one variable grouped by another.

The CLASS statement in PROC SUMMARY names the character or numeric variables you want the data to classify. The variables listed on the CLASS statement should be categorical. That is, they should have a few numbers of discrete values. 

For example, we can use the following code to find descriptive statistics for Weight grouped by Species:

proc summary data=sashelp.shoes;
var sales;
class region;
OUTPUT OUT=SUMDS;
run;
proc print data=sumds;
Proc Summary in SAS: Explained
Proc Summary by group

The ID statement – With the ID Statement, you can retain any variable to the output dataset other than the variables specified in the class and var statements.

Remember that variables that you specify with the ID statement are not summarized. Rather, the value of the ID variable on the last row summarized is retained. 

OUTPUT OUT – This statement names the output SAS data set.  It also defines the statistics for the variables and the variable name in the output dataset.

Available options on the Output Statement

  • OUTPUT OUT=: N NMISS PRT VAR MEAN RANGE CSS MIN SKEWNESS STD USS CV SUMWGT MAX KURTOSIS

See the Difference between Proc Means and Proc Summary.

Automatic Variables In Proc Summary

The SUMMARY procedure creates two variables automatically: _FREQ_ and _TYPE_.

_FREQ_ – This variable stores the number of rows from the input SAS dataset summarized into every row.

_TYPE_ – It contains a numeric value identifying the level of interaction between the variables in the CLASS list.

When a BY statement is used, the _TYPE_ variable will always equal 0. 

When the CLASS statement is used, the _TYPE_ variable will contain 0 for a total row and values of 1 through n for various levels of interaction between the variables in the CLASS list.

Proc Summary Options

There are two important SUMMARY procedure options: MISSING and NWAY.

MISSING – The Missing option instructs the SUMMARY procedure to consider missing values in a class variable when creating summary rows.

NWAY – This option instructs the SUMMARY procedure only to create rows with a combination of all class variables

DESCENDING – Arrange the lowest summary levels first (by default, they are arranged ascending) 

ORDER= – Specify sort order of CLASS variables

Note that these options are available only when used with the CLASS statement, not with the BY statement.

When the SUMMARY procedure is used with the BY statement, it will produce the same output file as when used with the CLASS statement combined with the NWAY option.

The Options AUTONAME and AUTOLABEL request the procedure to create unique and meaningful column names and labels for the results.

Example

The below code snippet produces summary statistics like – Total Sales, Average Sales, and Minimum and Maximum Sales for each region from the SASHELP.SHOES dataset.

proc summary data=sashelp.shoes;
	class Region;
	var sales;
	OUTPUT OUT=SUMDS SUM=TOTSales MEAN=AvgSales MIN= 
		MAX= /autoname autolabel;
run;
Proc Summary in SAS
Options in Proc Summary

The Options AUTONAME and AUTOLABEL request the procedure to create unique and meaningful column names and labels for the results.

How Are The TYPE Values Useful?

The TYPE variable is a part of the output SAS data set.

Using the _TYPE_ Variable, you can query against this variable’s value and use it to create different reports, each containing different information, with different levels of detail and summarization. 

We highly recommend reading the article written by Art Carpenter’s – which contains the relationship between _type_ and a class variable.

Interpreting _TYPE_values:

The below code snippet is used to group sashelp.cars dataset by Origin, Type and Drivetrain.

proc summary data=sashelp.cars;
class origin type drivetrain;
var msrp;
output out=cars_summary sum= mean= /autolabel autoname;
run;

TYPE =0 Represents the entire data set 

TYPE =1  Origin (across all Origins) 

TYPE =2 Represents Type(across all Types within Origins)

 TYPE =3 Represents Drivetrain within Types and origins 

After a PROC SUMMARY, a series of PROC PRINTs could be coded to select off different TYPE values and to create several different reports, each with a different level of information:

Suppose you want to find the Total MSRP by Region.

title "Summary Statistics by Origin";
proc print data=cars_suummary;
	where _type_=4;
run;
Proc Summary in SAS
title "Summary Statistics by Origin and Type";
proc print data=cars_suummary;
	where _type_=6;
run;
Proc Summary

Figuring Out TYPE Values

There are two ways to see your _TYPE_values:

Apply PROC PRINT to the output SAS data set, which may result in a LOT of output if you have several CLASS variables.

Another way is to manipulate the data to print only the first value of each _TYPE_ variable, which is enough to find out which _TYPE_ values you need (be careful of doing this if you have used the MISSING option on the PROC SUMMARY statement).

DATA cars;
	set cars_summary;
	BY _TYPE_;

	IF FIRST. _TYPE_;
RUN;

PROC PRINT DATA=cars;
	T1TLE1 'PRINTING ONLY THE FIRST OCCURRENCE OF EACH TYPE VALUE';
RUN;
Proc Summary

Proc Summary NWAY and LEVELS option

As discussed earlier, with the NWAY option, you can have only the combination of class variables in the output.

To demonstrate this see the example below where I have used the NWAY option to find the MSRP sum of Cars by Region and Type.

proc summary data=sashelp.cars nway;
 class origin type;
 var msrp;
 output out=summary_nway sum=msrp;
run;

Until now, you have seen that adding a class variable increases the _TYPE_ variable and eventually increases the output number.

Using the NWAY option, you can have only the combination of Origin and Type class variables.

NWAY option in Proc Summary
Using the NWAY and LEVELS option

WAYS Statement in Proc Summary

You can specify the number of ways to combine the class variables in the ways statement.

For example, if you want only the row combination of Origin, type and Drivetrain, then use the following WAYS statement:

proc summary data=sashelp.cars;
 class origin type drivetrain;
 var msrp;
 ways 1;
 output out=summary_nway sum=msrp;
run;
Ways Statement in Proc Summary
WAYS Statement in Proc Summary

You can also request multiple ways. For example, if you want all the rows representing a combination of two class variables – and you want the row representing the total (no combination of any class variables), you can use the following WAYS statement:

WAYS 0 2;

Optional Variables

You can use the LEVELS and WAYS options to the OUTPUT statement to include in the _LEVEL_ and _WAY_ variables in the output.

The _LEVEL_ variable contains a value from 1 to n that indicates the combination of class variables.

The _WAY_ variable contains a value from 1 to the maximum number of class variables, indicating how many class variables the SUMMARY procedure combines to create a row in the output SAS data set.

To use these options, add them to the OUTPUT statement after a “/”.

proc summary data=sashelp.cars;
 class origin type;
 var msrp;
 output out=summary_type sum=msrp /levels ways;
run;
Proc Summary in SAS: Explained
Optional Variables

TYPES Statements

The TYPES statement creates summary rows for combinations of variables that you specify in the CLASS statement. 

The TYPES statement does not work with the BY statement. 

You use this statement by specifying each combination of class variables you want to be included in the summary output by stating the class variables separated by an asterisk.

For example, if you want only the row combination of Origin and type, and you want the rows for DIV only, then use the following TYPES statement:

TYPES Origin*Type Origin;

proc summary data=sashelp.cars;
 class origin type;
 var msrp;
 types origin*type Origin;
 output out=summary_type sum=msrp /levels ways;
run;
Proc Summary in SAS: Explained
TYPES Statements

If you also want the total row, use the syntax TYPES()

PROC SUMMARY Without a VAR Statement

You can use the PROC SUMMARY procedure without a VAR statement. In this case, it displays the counts or the number of occurrences of your CLASS variables’ values. This gives PROC SUMMARY the same functionality that we find in PROC FREQ.

PROC SUMMARY DATA=sashelp.cars;
	CLASS origin drivetrain;
	OUTPUT OUT=cars1;
RUN;

PROC PRINT DATA=cars1;
	TITLE 'RESULT WITHOUT USING A VAR';
RUN;
Proc Summary in SAS: Explained
PROC SUMMARY Without a VAR Statement

PROC SUMMARY Without a CLASS Statement

PROC SUMMARY does not need to have a CLASS statement. PROC SUMMARY must have either a CLASS or a VAR statement, but it does not need to contain both. When no CLASS statement is provided, only a _TYPE_ =0 record is produced, and no other levels of variables are created.

PROC SUMMARY DATA=sashelp.cars;
	VAR msrp;
	OUTPUT OUT=cars2 SUM(msrp)= /autoname /autolabel;
RUN;
Proc Summary without Class Variable
PROC SUMMARY Without a CLASS Statement

The Takeaway:

So, this was our side of the PROC SUMMARY Procedure. We hope that you must have found this tutorial useful.

Moreover, if you have any other suggestions regarding other plagiarism tools, suggest us below the comment section. We will take those lists in our further blog post.

Thanks for reading!

If you liked this article, you might also want to read PROC MEANS and PROC FREQ.

Do you have any tips to add? Let us know in the comments.

Please subscribe to our mailing list for weekly updates. You can also find us on Instagram and Facebook.

Every week we'll send you SAS tips and in-depth tutorials

JOIN OUR COMMUNITY OF SAS Programmers!

Subhro Kar is an Analyst with over five years of experience. As a programmer specializing in SAS (Statistical Analysis System), Subhro also offers tutorials and guides on how to approach the coding language. His website, 9to5sas, offers students and new programmers useful easy-to-grasp resources to help them understand the fundamentals of SAS. Through this website, he shares his passion for programming while giving back to up-and-coming programmers in the field. Subhro’s mission is to offer quality tips, tricks, and lessons that give SAS beginners the skills they need to succeed.