Book description
Learn to program SAS by example! If you like learning by example, then Learning SAS by Example: A Programmer's Guide makes it easy to learn SAS programming. In an instructive and conversational tone, author Ron Cody clearly explains each programming technique and then illustrates it with one or more real-life examples, followed by a detailed description of how the program works. The text is divided into four major sections: Getting Started; DATA Step Processing; Presenting and Summarizing Your Data; and Advanced Topics. Subjects addressed include: Reading data from external sources Learning details of DATA step programming Subsetting and combining SAS data sets Understanding SAS functions and working with arrays Creating reports with PROC REPORT and PROC TABULATE Learning to use the SAS Output Delivery System Getting started with the SAS macro language Introducing PROC SQL You can test your knowledge and hone your skills by solving the problems at the end of each chapter. (Solutions to odd-numbered problems are located at the back of this book. Solutions to all problems are available to instructors by visiting Ron Cody's author page for details.) This book is intended for beginners and intermediate users. Readers should know how to enter and submit a SAS program from their operating system. This book is part of the SAS Press program.Table of contents
- Copyright
-
Contents
- List of Programs
- Preface
- Acknowledgments
- Part 1 Getting Started
- Chapter 1 What Is SAS?
- Chapter 2 Writing Your First SAS Program
- Part 2 DATA Step Processing
-
Chapter 3 Reading Raw Data from External Files
- 3.1 Introduction
- 3.2 Reading Data Values Separated by Blanks
- 3.3 Specifying Missing Values with List Input
- 3.4 Reading Data Values Separated by Commas (CSV Files)
- 3.5 Using an Alternative Method to Specify an External File
- 3.6 Reading Data Values Separated by Delimiters Other Than Blanks or Commas
- 3.7 Placing Data Lines Directly in Your Program (the DATALINES Statement)
- 3.8 Specifying INFILE Options with the DATALINES Statement
- 3.9 Reading Raw Data from Fixed Columns—Method 1: Column Input
- 3.10 Reading Raw Data from Fixed Columns—Method 2: Formatted Input
- 3.11 Using a FORMAT Statement in a DATA Step versus in a Procedure
- 3.12 Using Informats with List Input
- 3.13 Supplying an INFORMAT Statement with List Input
- 3.14 Using List Input with Embedded Delimiters
- 3.15 Problems
-
Chapter 4 Creating Permanent SAS Data Sets
- 4.1 Introduction
- 4.2 SAS Libraries—The LIBNAME Statement
- 4.3 Why Create Permanent SAS Data Sets?
- 4.4 Examining the Descriptor Portion of a SAS Data Set Using PROC CONTENTS
- 4.5 Listing All the SAS Data Sets in a SAS Library Using PROC CONTENTS
- 4.6 Viewing the Descriptor Portion of a SAS Data Set Using the SAS Explorer
- 4.7 Viewing the Data Portion of a SAS Data Set Using PROC PRINT
- 4.8 Viewing the Data Portion of a SAS Data Set Using the SAS VIEWTABLE Window
- 4.9 Using a SAS Data Set as Input to a DATA Step
- 4.10 DATA _NULL_: A Data Set That Isn’t
- 4.11 Problems
-
Chapter 5 Creating Formats and Labels
- 5.1 Adding Labels to Your Variables
- 5.2 Using Formats to Enhance Your Output
- 5.3 Regrouping Values Using Formats
- 5.4 More on Format Ranges
- 5.5 Storing Your Formats in a Format Library
- 5.6 Permanent Data Set Attributes
- 5.7 Accessing a Permanent SAS Data Set with User-Defined Formats
- 5.8 Displaying Your Format Definitions
- 5.9 Problems
- Chapter 6 Reading and Writing Data from an Excel Spreadsheet
-
Chapter 7 Performing Conditional Processing
- 7.1 Introduction
- 7.2 The IF and ELSE IF Statements
- 7.3 The Subsetting IF Statement
- 7.4 The IN Operator
- 7.5 Using a SELECT Statement for Logical Tests
- 7.6 Using Boolean Logic (AND, OR, and NOT Operators)
- 7.7 A Caution When Using Multiple OR Operators
- 7.8 The WHERE Statement
- 7.9 Some Useful WHERE Operators
- 7.10 Problems
- Chapter 8 Performing Iterative Processing: Looping
-
Chapter 9 Working with Dates
- 9.1 Introduction
- 9.2 How SAS Stores Dates
- 9.3 Reading Date Values from Raw Data
- 9.4 Computing the Number of Years between Two Dates
- 9.5 Demonstrating a Date Constant
- 9.6 Computing the Current Date
- 9.7 Extracting the Day of the Week, Day of the Month, Month, and Year from a SAS Date
- 9.8 Creating a SAS Date from Month, Day, and Year Values
- 9.9 Substituting the 15th of the Month when the Day Value Is Missing
- 9.10 Using Date Interval Functions
- 9.11 Problems
-
Chapter 10 Subsetting and Combining SAS Data Sets
- 10.1 Introduction
- 10.2 Subsetting a SAS Data Set
- 10.3 Creating More Than One Subset Data Set in One DATA Step
- 10.4 Adding Observations to a SAS Data Set
- 10.5 Interleaving Data Sets
- 10.6 Combining Detail and Summary Data
- 10.7 Merging Two Data Sets
- 10.8 Omitting the BY Statement in a Merge
- 10.9 Controlling Observations in a Merged Data Set
- 10.10 More Uses for IN= Variables
- 10.11 When Does a DATA Step End?
- 10.12 Merging Two Data Sets with Different BY Variable Names
- 10.13 Merging Two Data Sets with Different BY Variable Data Types
- 10.14 One-to-One, One-to-Many, and Many-to-Many Merges
- 10.15 Updating a Master File from a Transaction File
- 10.16 Problems
-
Chapter 11 Working with Numeric Functions
- 11.1 Introduction
- 11.2 Functions That Round and Truncate Numeric Values
- 11.3 Functions That Work with Missing Values
- 11.4 Setting Character and Numeric Values to Missing
- 11.5 Descriptive Statistics Functions
- 11.6 Computing Sums within an Observation
- 11.7 Mathematical Functions
- 11.8 Computing Some Useful Constants
- 11.9 Generating Random Numbers
- 11.10 Special Functions
- 11.11 Functions That Return Values from Previous Observations
- 11.12 Problems
-
Chapter 12 Working with Character Functions
- 12.1 Introduction
- 12.2 Determining the Length of a Character Value
- 12.3 Changing the Case of Characters
- 12.4 Removing Characters from Strings
- 12.5 Joining Two or More Strings Together
- 12.6 Removing Leading or Trailing Blanks
- 12.7 Using the COMPRESS Function to Remove Characters from a String
- 12.8 Searching for Characters
- 12.9 Searching for Individual Characters
- 12.10 Searching for Words in a String
- 12.11 Searching for Character Classes
- 12.12 Using the NOT Functions for Data Cleaning
- 12.13 Describing a Real Blockbuster Data Cleaning Function
- 12.14 Extracting Part of a String
- 12.15 Dividing Strings into Words
- 12.16 Comparing Strings
- 12.17 Performing a Fuzzy Match
- 12.18 Substituting Characters or Words
- 12.19 Problems
-
Chapter 13 Working with Arrays
- 13.1 Introduction
- 13.2 Setting Values of 999 to a SAS Missing Value for Several Numeric Variables
- 13.3 Setting Values of NA and ? to a Missing Character Value
- 13.4 Converting All Character Values to Lowercase
- 13.5 Using an Array to Create New Variables
- 13.6 Changing the Array Bounds
- 13.7 Temporary Arrays
- 13.8 Loading the Initial Values of a Temporary Array from a Raw Data File
- 13.9 Using a Multidimensional Array for Table Lookup
- 13.10 Problems
- Part 3 Presenting and Summarizing Your Data
-
Chapter 14 Displaying Your Data
- 14.1 Introduction
- 14.2 The Basics
- 14.3 Changing the Appearance of Your Listing
- 14.4 Changing the Appearance of Values
- 14.5 Controlling the Observations That Appear in Your Listing
- 14.6 Adding Additional Titles and Footnotes to Your Listing
- 14.7 Changing the Order of Your Listing
- 14.8 Sorting by More Than One Variable
- 14.9 Labeling Your Column Headings
- 14.10 Adding Subtotals and Totals to Your Listing
- 14.11 Making Your Listing Easier to Read
- 14.12 Adding the Number of Observations to Your Listing
- 14.13 Double-Spacing Your Listing
- 14.14 Listing the First n Observations of Your Data Set
- 14.15 Problems
-
Chapter 15 Creating Customized Reports
- 15.1 Introduction
- 15.2 Using PROC REPORT
- 15.3 Selecting Variables to Include in Your Report
- 15.4 Comparing Detail and Summary Reports
- 15.5 Producing a Summary Report
- 15.6 Demonstrating the FLOW Option of PROC REPORT
- 15.7 Using Two Grouping Variables
- 15.8 Changing the Order of Variables in the COLUMN Statement
- 15.9 Changing the Order of Rows in a Report
- 15.10 Applying the ORDER Usage to Two Variables
- 15.11 Creating a Multi-Column Report
- 15.12 Producing Report Breaks
- 15.13 Using a Nonprinting Variable to Order a Report
- 15.14 Computing a New Variable with PROC REPORT
- 15.15 Computing a Character Variable in a COMPUTE Block
- 15.16 Creating an ACROSS Variable with PROC REPORT
- 15.17 Modifying the Column Label for an ACROSS Variable
- 15.18 Using an ACROSS Usage to Display Statistics
- 15.19 Problems
-
Chapter 16 Summarizing Your Data
- 16.1 Introduction
- 16.2 PROC MEANS—Starting from the Beginning
- 16.3 Adding a BY Statement to PROC MEANS
- 16.4 Using a CLASS Statement with PROC MEANS
- 16.5 Applying a Format to a CLASS Variable
- 16.6 Deciding between a BY Statement and a CLASS Statement
- 16.7 Creating Summary Data Sets Using PROC MEANS
- 16.8 Outputting Other Descriptive Statistics with PROC MEANS
- 16.9 Asking SAS to Name the Variables in the Output Data Set
- 16.10 Outputting a Summary Data Set: Including a BY Statement
- 16.11 Outputting a Summary Data Set: Including a CLASS Statement
- 16.12 Using Two CLASS Variables with PROC MEANS
- 16.13 Selecting Different Statistics for Each Variable
- 16.14 Problems
-
Chapter 17 Counting Frequencies
- 17.1 Introduction
- 17.2 Counting Frequencies
- 17.3 Selecting Variables for PROC FREQ
- 17.4 Using Formats to Label the Output
- 17.5 Using Formats to Group Values
- 17.6 Problems Grouping Values with PROC FREQ
- 17.7 Displaying Missing Values in the Frequency Table
- 17.8 Changing the Order of Values in PROC FREQ
- 17.9 Producing Two-Way Tables
- 17.10 Requesting Multiple Two-Way Tables
- 17.11 Producing Three-Way Tables
- 17.12 Problems
-
Chapter 18 Creating Tabular Reports
- 18.1 Introduction
- 18.2 A Simple PROC TABULATE Table
- 18.3 Describing the Three PROC TABULATE Operators
- 18.4 Using the Keyword ALL
- 18.5 Producing Descriptive Statistics
- 18.6 Combining CLASS and Analysis Variables in a Table
- 18.7 Customizing Your Table
- 18.8 Demonstrating a More Complex Table
- 18.9 Computing Row and Column Percentages
- 18.10 Displaying Percentages in a Two-Dimensional Table
- 18.11 Computing Column Percentages
- 18.12 Computing Percentages on Numeric Variables
- 18.13 Understanding How Missing Values Affect PROC TABULATE Output
- 18.14 Problems
- Chapter 19 Introducing the Output Delivery System
-
Chapter 20 Generating High-Quality Graphics
- 20.1 Introduction
- 20.2 Some Basic Concepts
- 20.3 Producing Simple Bar Charts Using PROC GCHART
- 20.4 Creating Pie Charts
- 20.5 Creating Bar Charts for a Continuous Variable
- 20.6 Creating Charts with Values Representing Categories
- 20.7 Creating Bar Charts Representing Sums
- 20.8 Creating Bar Charts Representing Means
- 20.9 Adding Another Variable to the Chart
- 20.10 Producing Scatter Plots
- 20.11 Connecting Points
- 20.12 Connecting Points with a Smooth Line
- 20.13 Problems
- Part 4 Advanced Topics
-
Chapter 21 Using Advanced INPUT Techniques
- 21.1 Introduction
- 21.2 Handling Missing Values at the End of a Line
- 21.3 Reading Short Data Lines
- 21.4 Reading External Files with Lines Longer Than 256 Characters
- 21.5 Detecting the End of the File
- 21.6 Reading a Portion of a Raw Data File
- 21.7 Reading Data from Multiple Files
- 21.8 Reading Data from Multiple Files Using a FILENAME Statement
- 21.9 Reading External Filenames from a Data File
- 21.10 Reading Multiple Lines of Data to Form One Observation
- 21.11 Reading Data Conditionally (the Single Trailing @ Sign)
- 21.12 More Examples of the Single Trailing @ Sign
- 21.13 Creating Multiple Observations from One Line of Input
- 21.14 Using Variable and Informat Lists
- 21.15 Using Relative Column Pointers to Read a Complex Data Structure Efficiently
- 21.16 Problems
-
Chapter 22 Using Advanced Features of User-Defined Formats and Informats
- 22.1 Introduction
- 22.2 Using Formats to Recode Variables
- 22.3 Using Formats with a PUT Function to Create New Variables
- 22.4 Creating User-Defined Informats
- 22.5 Reading Character and Numeric Data in One Step
- 22.6 Using Formats (and Informats) to Perform Table Lookup
- 22.7 Using a SAS Data Set to Create a Format
- 22.8 Updating and Maintaining Your Formats
- 22.9 Using Formats within Formats
- 22.10 Multilabel Formats
- 22.11 Using the INPUTN Function to Perform a More Complicated Table Lookup
- 22.12 Problems
-
Chapter 23 Restructuring SAS Data Sets
- 23.1 Introduction
- 23.2 Converting a Data Set with One Observation per Subject to a Data Set with Several Observations per Subject: Using a DATA Step
- 23.3 Converting a Data Set with Several Observations per Subject to a Data Set with One Observation per Subject: Using a DATA Step
- 23.4 Converting a Data Set with One Observation per Subject to a Data Set with Several Observations per Subject: Using PROC TRANSPOSE
- 23.5 Converting a Data Set with Several Observations per Subject to a Data Set with One Observation per Subject: Using PROC TRANSPOSE
- 23.6 Problems
-
Chapter 24 Working with Multiple Observations per Subject
- 24.1 Introduction
- 24.2 Identifying the First or Last Observation in a Group
- 24.3 Counting the Number of Visits Using PROC FREQ
- 24.4 Counting the Number of Visits Using PROC MEANS
- 24.5 Computing Differences between Observations
- 24.6 Computing Differences between the First and Last Observation in a BY Group Using the LAG Function
- 24.7 Computing Differences between the First and Last Observation in a BY Group Using a RETAIN Statement
- 24.8 Using a Retained Variable to “Remember” a Previous Value
- 24.9 Problems
-
Chapter 25 Introducing the SAS Macro Language
- 25.1 Introduction
- 25.2 Macro Variables: What Are They?
- 25.3 Some Built-In Macro Variables
- 25.4 Assigning Values to Macro Variables with a %LET Statement
- 25.5 Demonstrating a Simple Macro
- 25.6 A Word about Tokens
- 25.7 Another Example of Using a Macro Variable as a Prefix
- 25.8 Using a Macro Variable to Transfer a Value between DATA Steps
- 25.9 Problems
- Chapter 26 Introducing the Structured Query Language
- Solutions to Odd-Numbered Problems
- Index
-
List of Programs
- Programs in Chapter 1
- Programs in Chapter 2
-
Programs in Chapter 3
- 3-1 Demonstrating list input with blanks as delimiters
- 3-2 Adding PROC PRINT to list the observations in the data set
- 3-3 Reading data from a comma-separated values (CSV) file
- 3-4 Using a FILENAME statement to identify an external file
- 3-5 Demonstrating the DATALINES statement
- 3-6 Using INFILE options with DATALINES
- 3-7 Demonstrating column input
- 3-8 Demonstrating formatted input
- 3-9 Demonstrating a FORMAT statement
- 3-10 Rerunning Program 3-9 with a different format
- 3-11 Using informats with list input
- 3-12 Supplying an INFORMAT statement with list input
- 3-13 Demonstrating the ampersand modifier for list input
-
Programs in Chapter 4
- 4-1 Creating a permanent SAS data set
- 4-2 Using PROC CONTENTS to examine the descriptor portion of a SAS data set
- 4-3 Demonstrating the VARNUM option of PROC CONTENTS
- 4-4 Using a LIBNAME in a new SAS session
- 4-5 Using PROC CONTENTS to list the names of all the SAS data sets in a SAS library
- 4-6 Using PROC PRINT to list the data portion of a SAS data set
- 4-7 Using observations from a SAS data set as input to a new SAS data set
- 4-8 Demonstrating a DATA _NULL_ step
-
Programs in Chapter 5
- 5-1 Adding labels to variables in a SAS data set
- 5-2 Using PROC FORMAT to create user-defined formats
- 5-3 Adding a FORMAT statement in PROC PRINT
- 5-4 Regrouping values using a format
- 5-5 Applying the new format to several variables with PROC FREQ
- 5-6 Creating a permanent format library
- 5-7 Adding LABEL and FORMAT statements in the DATA step
- 5-8 Running PROC CONTENTS on a data set with labels and formats
- 5-9 Using a user-defined format
- 5-10 Displaying format definitions in a user-created library
- 5-11 Demonstrating a SELECT statement with PROC FORMAT
- Programs in Chapter 6
-
Programs in Chapter 7
- 7-1 First attempt to group ages into age groups (incorrect)
- 7-2 Corrected program to group ages into age groups
- 7-3 An alternative to Program 7-2
- 7-4 Demonstrating a subsetting IF statement
- 7-5 Demonstrating a SELECT statement when a select-expression is missing
- 7-6 Combining various Boolean operators
- 7-7 A caution on the use of multiple OR operators
- 7-8 Using a WHERE statement to subset a SAS data set
-
Programs in Chapter 8
- 8-1 Example of a program that does not use a DO group
- 8-2 Demonstrating a DO group
- 8-3 Attempt to create a cumulative total
- 8-4 Adding a RETAIN statement to Program 8-3
- 8-5 Third attempt to create cumulative total
- 8-6 Using a sum statement to create a cumulative total
- 8-7 Using a sum statement to create a counter
- 8-8 Program without iterative loops
- 8-9 Demonstrating an iterative DO loop
- 8-10 Using an iterative DO loop to make a table of squares and square roots
- 8-11 Using an iterative DO loop to graph an equation
- 8-12 Using character values for DO loop index values
- 8-13 Demonstrating a DO UNTIL loop
- 8-14 Demonstrating that a DO UNTIL loop always executes at least once
- 8-15 Demonstrating a DO WHILE statement
- 8-16 Demonstrating that DO WHILE loops are evaluated at the top
- 8-17 Combining a DO UNTIL and iterative DO loop
- 8-18 Demonstrating the LEAVE statement
- 8-19 Demonstrating a CONTINUE statement
-
Programs in Chapter 9
- 9-1 Program to read dates from raw data
- 9-2 Adding a FORMAT statement to format each of the date values
- 9-3 Compute a person’s age in years
- 9-4 Demonstrating a date constant
- 9-5 Using the TODAY function to return the current date
- 9-6 Extracting the day of the week, day of the month, month, and year from a SAS date
- 9-7 Using the MDY function to create a SAS date from month, day, and year values
- 9-8 Substituting the 15th of the month when a day value is missing
- 9-9 Demonstrating the INTCK function
- 9-10 Using the INTNX function to compute dates 6 months after discharge
- 9-11 Demonstrating the SAMEDAY alignment with the INTNX function
-
Programs in Chapter 10
- 10-1 Subsetting a SAS data set using a WHERE statement
- 10-2 Demonstrating a DROP= data set option
- 10-3 Creating two data sets in one DATA step
- 10-4 Using a SET statement to combine observations from two data sets
- 10-5 Using a SET statement on two data sets containing different variables
- 10-6 Interleaving data sets
- 10-7 Combining detail and summary data: using a conditional SET statement
- 10-8 Merging two SAS data sets
- 10-9 Demonstrating the IN= data set option
- 10-10 Using IN= variables to select IDs that are in both data sets
- 10-11 More examples of using IN= variables
- 10-12 Demonstrating when a DATA step ends
- 10-13 Merging two data sets by renaming a variable in one data set
- 10-14 Merging two data sets when the BY variables are different data types
- 10-15 An alternative to Program 10-14
- 10-16 Updating a master file from a transaction file
-
Programs in Chapter 11
- 11-1 Demonstrating the ROUND and INT truncation functions
- 11-2 Testing for missing numeric and character values (without the missing function)
- 11-3 Demonstrating the MISSING function
- 11-4 Demonstrating the N, MEAN, MIN, and MAX functions
- 11-5 Finding the sum of the three largest values in a list of variables
- 11-6 Using the SUM function to compute totals
- 11-7 Demonstrating the ABS, SQRT, EXP, and LOG functions
- 11-8 Computing some useful constants with the CONSTANT function
- 11-9 Using the RANUNI function to randomly select observations
- 11-10 Using PROC SURVEYSELECT to obtain a random sample 200
- 11-11 Using the INPUT function to perform a character-to-numeric conversion
- 11-12 Demonstrating the PUT function
- 11-13 Demonstrating the LAG and LAGn functions
- 11-14 Demonstrating what happens when you execute a LAG function conditionally
- 11-15 Using the LAG function to compute interobservation differences
- 11-16 Demonstrating the DIF function
-
Programs in Chapter 12
- 12-1 Determining the length of a character value
- 12-2 Changing values to uppercase
- 12-3 Converting multiple blanks to a single blank and demonstrating the PROPCASE function
- 12-4 Demonstrating the concatenation functions
- 12-5 Demonstrating the TRIM, LEFT, and STRIP functions
- 12-6 Using the COMPRESS function to remove characters from a string
- 12-7 Demonstrating the COMPRESS modifiers
- 12-8 Demonstrating the FIND and COMPRESS functions
- 12-9 Demonstrating the FINDW function
- 12-10 Demonstrating the ANYDIGIT function
- 12-11 Demonstrating the NOT functions for data cleaning
- 12-12 Using the VERIFY function for data cleaning
- 12-13 Using the SUBSTR function to extract substrings
- 12-14 Demonstrating the SCAN function
- 12-15 Using the SCAN function to extract the last name
- 12-16 Demonstrating the COMPARE function
- 12-17 Clarifying the use of the colon modifier with the COMPAREfunction
- 12-18 Using the SPEDIS function to perform a fuzzy match
- 12-19 Demonstrating the TRANSLATE function
- 12-20 Using the TRANWRD function to standardize an address
-
Programs in Chapter 13
- 13-1 Converting values of 999 to a SAS missing value—without using arrays
- 13-2 Converting values of 999 to a SAS missing value—using arrays
- 13-3 Rewriting Program 13-2 using the CALL MISSING routine
- 13-4 Converting values of NA and ? to missing character values
- 13-5 Converting all character values in a SAS data set to lowercase
- 13-6 Using an array to create new variables
- 13-7 Changing the array bounds
- 13-8 Using a temporary array to score a test
- 13-9 Loading the initial values of a temporary array from a raw data file
- 13-10 Loading a two-dimensional, temporary array with data values
-
Programs in Chapter 14
- 14-1 PROC PRINT using all the defaults
- 14-2 Controlling which variables appear in the listing
- 14-3 Using an ID statement to omit the Obs column
- 14-4 Adding a FORMAT statement to PROC PRINT
- 14-5 Controlling which observations appear in the listing (WHERE statement)
- 14-6 Using the IN operator in a WHERE statement
- 14-7 Adding titles and footnotes to your listing
- 14-8 Using PROC SORT to change the order of your observations
- 14-9 Demonstrating the DESCENDING option of PROC SORT
- 14-10 Sorting by more than one variable
- 14-11 Using labels as column headings with PROC PRINT
- 14-12 Using a BY statement in PROC PRINT
- 14-13 Adding totals and subtotals to your listing
- 14-14 Using an ID statement and a BY statement in PROC PRINT
- 14-15 Demonstrating the N= option with PROC PRINT
- 14-16 Double-spacing your listing
- 14-17 Listing the first five observations of your data set
- 14-18 Forcing variable labels to print horizontally
-
Programs in Chapter 15
- 15-1 Listing of Medical using PROC PRINT
- 15-2 Using PROC REPORT (all defaults)
- 15-3 Adding a COLUMN statement to PROC REPORT
- 15-4 Using PROC REPORT with only numeric variables
- 15-5 Using DEFINE statements to define a display usage
- 15-6 Specifying a GROUP usage to create a summary report
- 15-7 Demonstrating the FLOW option with PROC REPORT
- 15-8 Explicitly defining usage for every variable
- 15-9 Demonstrating the effect of two variables with GROUP usage
- 15-10 Reversing the order of variables in the COLUMN statement
- 15-11 Demonstrating the ORDER usage of PROC REPORT
- 15-12 Applying the ORDER usage for two variables
- 15-13 Creating a multi-column report
- 15-14 Requesting a report break (RBREAK statement)
- 15-15 Demonstrating the BREAK statement of PROC REPORT
- 15-16 Using a nonprinting variable to order the rows of a report
- 15-17 Computing a new variable with PROC REPORT
- 15-18 Demonstrating an ACROSS usage in PROC REPORT
-
Programs in Chapter 16
- 16-1 PROC MEANS with all the defaults
- 16-2 Adding a VAR statement and requesting specific statistics with PROC MEANS
- 16-3 Adding a BY statement to PROC MEANS
- 16-4 Using a CLASS statement with PROC MEANS
- 16-5 Demonstrating the effect of a formatted CLASS variable
- 16-6 Creating a summary data set using PROC MEANS
- 16-7 Outputting more than one statistic with PROC MEANS
- 16-8 Demonstrating the OUTPUT option AUTONAME
- 16-9 Adding a BY statement to PROC MEANS
- 16-10 Adding a CLASS statement to PROC MEANS
- 16-11 Adding the NWAY option to PROC MEANS
- 16-12 Using two CLASS variables with PROC MEANS
- 16-13 Adding the CHARTYPE procedure option to PROC MEANS
- 16-14 Using the _TYPE_ variable to select cell means
- 16-15 Using a DATA step to create separate summary data sets
- 16-16 Selecting different statistics for each variable using PROC MEANS
-
Programs in Chapter 17
- 17-1 Counting frequencies: one-way tables using PROC FREQ
- 17-2 Adding a TABLES statement to PROC FREQ
- 17-3 Adding formats to Program 17-2
- 17-4 Using formats to group values
- 17-5 Demonstrating a problem in how PROC FREQ groups values
- 17-6 Fixing the grouping problem
- 17-7 Demonstrating the effect of the MISSING option of PROC FREQ
- 17-8 Demonstrating the ORDER= option of PROC FREQ
- 17-9 Demonstrating the ORDER= formatted, data, and freq options
- 17-10 Requesting a two-way table
- 17-11 Requesting a three-way table with PROC FREQ
-
Programs in Chapter 18
- 18-1 PROC TABULATE with all the defaults and a single CLASS variable
- 18-2 Demonstrating concatenation with PROC TABULATE
- 18-3 Demonstrating table dimensions with PROC TABULATE
- 18-4 Demonstrating the nesting operator with PROC TABULATE
- 18-5 Adding the keyword ALL to your table request
- 18-6 Using PROC TABULATE to produce descriptive statistics
- 18-7 Specifying statistics on an analysis variable with PROC TABULATE
- 18-8 Specifying more than one descriptive statistic with PROC TABULATE
- 18-9 Combining CLASS and analysis variables in a table
- 18-10 Associating a different format with each variable in a table
- 18-11 Renaming keywords with PROC TABULATE
- 18-12 Eliminating the N column in a PROC TABULATE table
- 18-13 Demonstrating a more complex table
- 18-14 Computing percentages in a one-dimensional table
- 18-15 Improving the appearance of output from Program 18-14
- 18-16 Counts and percentages in a two-dimensional table
- 18-17 Using COLPCTN to compute column percentages
- 18-18 Computing percentages on a numeric value
- 18-19 Demonstrating the effect of missing values on CLASS variables
- 18-20 Missing values on a CLASS variable that is not used in the table
- 18-21 Adding the PROC TABULATE procedure option MISSING
- 18-22 Demonstrating the MISSTEXT= TABLES option
-
Programs in Chapter 19
- 19-1 Sending SAS output to an HTML file
- 19-2 Creating a table of contents for HTML output
- 19-3 Choosing a style for HTML output
- 19-4 Using an ODS SELECT statement to restrict PROC UNIVARIATE output
- 19-5 Using the ODS TRACE statement to identify output objects
- 19-6 Using ODS to send procedure output to a SAS data set
- 19-7 Using an output data set to create a simplified report
-
Programs in Chapter 20
- 20-1 Producing a simple bar chart using PROC GCHART
- 20-2 Creating a simple pie chart
- 20-3 Creating a bar chart for a continuous variable
- 20-4 Selecting your own midpoints for the chart
- 20-5 Demonstrating the need for the DISCRETE option of PROC GCHART
- 20-6 Demonstrating the DISCRETE option of PROC GCHART
- 20-7 Creating a bar chart where the height of the bars represents sums
- 20-8 Creating a bar chart where the height of the bars represents means
- 20-9 Adding another variable to the chart
- 20-10 Demonstrating the SUBGROUP= option
- 20-11 Creating a simple scatter plot using all the defaults
- 20-12 Changing the plotting symbol and controlling the axis ranges
- 20-13 Joining the points with straight lines (first attempt)
- 20-14 Using the JOIN option on a sorted data set
- 20-15 Drawing a smooth line through your data points
-
Programs in Chapter 21
- 21-1 Missing values at the end of a line with list input
- 21-2 Reading a raw data file with short records
- 21-3 Demonstrating the INFILE PAD option
- 21-4 Demonstrating the END= option in the INFILE statement
- 21-5 Demonstrating the OBS= INFILE option to read the first three lines of data
- 21-6 Using the OBS= and FIRSTOBS= INFILE options together
- 21-7 Using the END= option to read data from multiple files
- 21-8 Reading external filenames from an external file
- 21-9 Reading external filenames using a DATALINES statement
- 21-10 Reading multiple lines of data to create one observation
- 21-11 Using an alternate method of reading multiple lines of data to form one SAS observation
- 21-12 Incorrect attempt to read a file of mixed record types
- 21-13 Using a trailing @ to read a file with mixed record types
- 21-14 Another example of a trailing @ sign
- 21-15 Creating one observation from one line of data
- 21-16 Creating several observations from one line of data
-
Programs in Chapter 22
- 22-1 Using a format to recode a variable
- 22-2 Using a format and a PUT function to create a new variable
- 22-3 Demonstrating a user-written informat
- 22-4 Demonstrating informat options UPCASE and JUST
- 22-5 A traditional approach to reading a combination of character and numeric data
- 22-6 Using an enhanced numeric informat to read a combination of character and numeric data
- 22-7 Another example of an enhanced numeric informat
- 22-8 Using formats and informats to perform a table lookup
- 22-9 Creating a test data set that will be used to make a CNTLIN data set
- 22-10 Creating a CNTLIN data set from an existing SAS data set
- 22-11 Using the CNTLIN= created data set
- 22-12 Adding an OTHER category to your format
- 22-13 Updating an existing format using a CNTLOUT= data set option
- 22-14 Demonstrating nested formats
- 22-15 Using the nested format in a DATA step
- 22-16 Creating a MULTILABEL format
- 22-17 Using a MULTILABEL format with PROC MEANS
- 22-18 Using the PRELOADFMT, PRINTMISS, and MISSTEXT options with PROC TABULATE
- 22-19 Partial program showing how to create several informats
- 22-20 Creating several informats with a single CNTLIN data set
- 22-21 Using a SELECT statement to display the contents of two informats
- 22-22 Using user-defined informats to perform a table lookup using the INPUTN function
-
Programs in Chapter 23
- 23-1 Creating a data set with several observations per subject from a data set with one observation per subject
- 23-2 Creating a data set with one observation per subject from a data set with several observations per subject
- 23-3 Using PROC TRANSPOSE to convert a data set with one observation per subject into a data set with several observations per subject (first attempt)
- 23-4 Using PROC TRANSPOSE to convert a data set with one observation per subject into a data set with several observations per subject
- 23-5 Using PROC TRANSPOSE to convert a SAS data set with several observations per subject into one with one observation per subject
-
Programs in Chapter 24
- 24-1 Creating FIRST. and LAST. Variables
- 24-2 Counting the number of visits per patient using a DATA step
- 24-3 Using PROC FREQ to count the number of observations in a BY group
- 24-4 Using the RENAME= and DROP= data set options to control the output data set
- 24-5 Using PROC MEANS to count the number of observations in a BY group
- 24-6 Computing differences between observations
- 24-7 Computing differences between the first and last observation in a BY group
- 24-8 Demonstrating the use of retained variables
- 24-9 Using a retained variable to “remember” a previous value
-
Programs in Chapter 25
- 25-1 Using an automatic macro variable to include a date and time in a title
- 25-2 Assigning a value to a macro variable with a %LET statement
- 25-3 Another example of using a %LET statement
- 25-4 Writing a simple macro
- 25-5 Program 25-4 with documentation added
- 25-6 Demonstrating a problem with resolving a macro variable
- 25-7 Program 25-6 corrected
- 25-8 Using a macro variable as a prefix (incorrect version)
- 25-9 Using a macro variable as a prefix (corrected version)
- 25-10 Using macro variables to transfer values from one DATA step to another
-
Programs in Chapter 26
- 26-1 Demonstrating a simple query from a single data set
- 26-2 Using an asterisk to select all the variables in a data set
- 26-3 Using PROC SQL to create a SAS data set
- 26-4 Joining two tables (Cartesian product)
- 26-5 Renaming the two Subj variables
- 26-6 Using aliases to simplify naming variables
- 26-7 Performing an inner join
- 26-8 Demonstrating a left, right, and full join
- 26-9 Concatenating two tables
- 26-10 Using a summary function in PROC SQL
- 26-11 Demonstrating an ORDER clause
- 26-12 Using PROC SQL to perform a fuzzy match
- Acknowledgments
- Preface
- Part 1
- Chapter 1 What Is SAS?
- Chapter 2 Writing Your First SAS Program
- Part 2
-
Chapter 3 Reading Raw Data from External Files
- 3.1 Introduction
- 3.2 Reading Data Values Separated by Blanks
- 3.3 Specifying Missing Values with List Input
- 3.4 Reading Data Values Separated by Commas (CSV Files)
- 3.5 Using an alternative Method to Specify an External File
- 3.6 Reading Data Values Separated by Delimiters Other Than Blanks or Commas
- 3.7 Placing Data Lines Directly in Your Program (the DATALINES Statement)
- 3.8 Specifying INFILE Options with the DATALINES Statement
- 3.9 Reading Raw Data from Fixed Columns—Method 1: Column Input
- 3.10 Reading Raw Data from Fixed Columns— Method 2: Formatted Input
- 3.11 Using a FORMAT Statement in a DATA Step versus in a Procedure
- 3.12 Using Informats with List Input
- 3.13 Supplying an INFORMAT Statement with List Input
- 3.14 Using List Input with Embedded Delimiters
- 3.15 Problems
-
Chapter 4 Creating Permanent SAS Data Sets
- 4.1 Introduction
- 4.2 SAS Libraries—The LIBNAME Statement
- 4.3 Why Create Permanent SAS Data Sets?
- 4.4 Examining the Descriptor Portion of a SAS Data Set Using PROC CONTENTS
- 4.5 Listing All the SAS Data Sets in a SAS Library Using PROC CONTENTS
- 4.6 Viewing the Descriptor Portion of a SAS Data Set Using the SAS Explorer
- 4.7 Viewing the Data Portion of a SAS Data Set Using PROC PRINT
- 4.8 Viewing the Data Portion of a SAS Data Set Using the SAS VIEWTABLE Window
- 4.9 Using a SAS Data Set as Input to a DATA Step
- 4.10 DATA _NULL_: A Data Set That Isn’t
- 4.11 Problems
-
Chapter 5 Creating Formats and Labels
- 5.1 Adding Labels to Your Variables
- 5.2 Using Formats to Enhance Your Output
- 5.3 Regrouping Values Using Formats
- 5.4 More on Format Ranges
- 5.5 Storing Your Formats in a Format Library
- 5.6 Permanent Data Set Attributes
- 5.7 Accessing a Permanent SAS Data Set with User-Defined Formats
- 5.8 Displaying Your Format Definitions
- 5.9 Problems
- Chapter 6 Reading and Writing Data from an Excel Spreadsheet
-
Chapter 7 Performing Conditional Processing
- 7.1 Introduction
- 7.2 The IF and ELSE IF Statements
- 7.3 The Subsetting IF Statement
- 7.4 The IN Operator
- 7.5 Using a SELECT Statement for Logical Tests
- 7.6 Using Boolean Logic (AND, OR, and NOT Operators)
- 7.7 A Caution When Using Multiple OR Operators
- 7.8 The WHERE Statement
- 7.9 Some Useful WHERE Operators
- 7.10 Problems
- Chapter 8 Performing Iterative Processing: Looping
-
Chapter 9 Working with Dates
- 9.1 Introduction
- 9.2 How SAS Stores Dates
- 9.4 Computing the Number of Years between Two Dates
- 9.5 Demonstrating a Date Constant
- 9.6 Computing the Current Date
- 9.7 Extracting the Day of the Week, Day of the Month, Month, and Year from a SAS Date
- 9.8 Creating a SAS Date from Month, Day, and Year Values
- 9.9 Substituting the 15th of the Month when the Day Value Is Missing
- 9.10 Using Date Interval Functions
- 9.11 Problems
-
Chapter 10 Subsetting and Combining SAS Data Sets
- 10.1 Introduction
- 10.2 Subsetting a SAS Data Set
- 10.3 Creating More Than One Subset Data Set in One DATA Step
- 10.4 Adding Observations to a SAS Data Set
- 10.5 Interleaving Data Sets
- 10.6 Combining Detail and Summary Data
- 10.7 Merging Two Data Sets
- 10.8 Omitting the BY Statement in a Merge
- 10.9 Controlling Observations in a Merged Data Set
- 10.10 More Uses for IN= Variables
- 10.11 When Does a DATA Step End?
- 10.12 Merging Two Data Sets with Different BY Variable Names
- 10.13 Merging Two Data Sets with Different BY Variable Data Types
- 10.14 One-to-One, One-to-Many, and Many-to-Many Merges
- 10.15 Updating a Master File from a Transaction File
- 10.16 Problems
-
Chapter 11 Working with Numeric Functions
- 11.1 Introduction
- 11.2 Functions That Round and Truncate Numeric Values
- 11.3 Functions That Work with Missing Values
- 11.4 Setting Character and Numeric Values to Missing
- 11.5 Descriptive Statistics Functions
- 11.6 Computing Sums within an Observation
- 11.7 Mathematical Functions
- 11.8 Computing Some Useful Constants
- 11.9 Generating Random Numbers
- 11.10 Special Functions
- 11.11 Functions That Return Values from Previous Observations
- 11.12 Problems
-
Chapter 12 Working with Character Functions
- 12.1 Introduction
- 12.2 Determining the Length of a Character Value
- 12.3 Changing the Case of Characters
- 12.4 Removing Characters from Strings
- 12.5 Joining Two or More Strings Together
- 12.6 Removing Leading or Trailing Blanks
- 12.7 Using the COMPRESS Function to Remove Characters from a String
- 12.8 Searching for Characters
- 12.10 Searching for Words in a String
- 12.11 Searching for Character Classes
- 12.12 Using the NOT Functions for Data Cleaning
- 12.13 Describing a Real Blockbuster Data Cleaning Function
- 12.14 Extracting Part of a String
- 12.15 Dividing Strings into Words
- 12.16 Comparing Strings
- 12.17 Performing a Fuzzy Match
- 12.18 Substituting Characters or Words
- 12.19 Problems
-
Chapter 13 Working with Arrays
- 13.1 Introduction
- 13.2 Setting Values of 999 to a SAS Missing Value for Several Numeric Variables
- 13.3 Setting Values of NA and ? to a Missing Character Value
- 13.4 Converting All Character Values to Lowercase
- 13.5 Using an Array to Create New Variables
- 13.6 Changing the Array Bounds
- 13.7 Temporary Arrays
- 13.8 Loading the Initial Values of a Temporary Array from a Raw Data File
- 13.9 Using a Multidimensional Array for Table Lookup
- 13.10 Problems
-
Chapter 14 Displaying Your Data
- 14.1 Introduction
- 14.2 The Basics
- 14.3 Changing the Appearance of Your Listing
- 14.4 Changing the Appearance of Values
- 14.5 Controlling the Observations That Appear in Your Listing
- 14.6 Adding Additional Titles and Footnotes to Your Listing
- 14.7 Changing the Order of Your Listing
- 14.8 Sorting by More Than One Variable
- 14.9 Labeling Your Column Headings
- 14.10 Adding Subtotals and Totals to Your Listing
- 14.11 Making Your Listing Easier to Read
- 14.12 Adding the Number of Observations to Your Listing
- 14.13 Double-Spacing Your Listing
- 14.14 Listing the First n Observations of Your Data Set
- 14.15 Problems
- Part 3
-
Chapter 15 Creating Customized Reports
- 15.1 Introduction
- 15.2 Using PROC REPORT
- 15.3 Selecting the Variables to Include in Your Report
- 15.4 Comparing Detail and Summary Reports
- 15.5 Producing a Summary Report
- 15.6 Demonstrating the FLOW Option of PROC REPORT
- 15.7 Using Two Grouping Variables
- 15.8 Changing the Order of Variables in the COLUMN Statement
- 15.9 Changing the Order of Rows in a Report
- 15.10 Applying the ORDER Usage to Two Variables
- 15.11 Creating a Multi-Column Report
- 15.12 Producing Report Breaks
- 15.13 Using a Nonprinting Variable to Order a Report
- 15.14 Computing a New Variable with PROC REPORT
- 15.15 Computing a Character Variable in a COMPUTE Block
- 15.16 Creating an ACROSS Variable with PROC REPORT
- 15.17 Modifying the Column Label for an ACROSS Variable
- 15.18 Using an ACROSS Usage to Display Statistics
- 15.19 Problems
-
Chapter 16 Summarizing Your Data
- 16.1 Introduction
- 16.2 PROC MEANS—Starting from the Beginning
- 16.3 Adding a BY Statement to PROC MEANS
- 16.4 Using a CLASS Statement with PROC MEANS
- 16.5 Applying a Format to a CLASS Variable
- 16.6 Deciding between a BY Statement and a CLASS Statement
- 16.7 Creating Summary Data Sets Using PROC MEANS
- 16.8 Outputting Other Descriptive Statistics with PROC MEANS
- 16.9 Asking SAS to Name the Variables in the Output Data Set
- 16.10 Outputting a Summary Data Set: Including a BY Statement
- 16.11 Outputting a Summary Data Set: Including a CLASS Statement
- 16.12 Using Two CLASS Variables with PROC MEANS
- 16.13 Selecting Different Statistics for Each Variable
- 16.14 Problems
-
Chapter 17 Counting Frequencies
- 17.1 Introduction
- 17.2 Counting Frequencies
- 17.4 Using Formats to Label the Output
- 17.5 Using Formats to Group Values
- 17.6 Problems Grouping Values with PROC FREQ
- 17.7 Displaying Missing Values in the Frequency Table
- 17.8 Changing the Order of Values in PROC FREQ
- 17.9 Producing Two-Way Tables
- 17.11 Producing Three-Way Tables
- 17.12 Problems
-
Chapter 18 Creating Tabular Reports
- 18.1 Introduction
- 18.2 A Simple PROC TABULATE Table
- 18.3 Describing the Three PROC TABULATE Operators
- 18.4 Using the Keyword ALL
- 18.5 Producing Descriptive Statistics
- 18.6 Combining CLASS and Analysis Variables in a Table
- 18.7 Customizing Your Table
- 18.8 Demonstrating a More Complex Table
- 18.9 Computing Row and Column Percentages
- 18.10 Displaying Percentages in a Two-Dimensional Table
- 18.11 Computing Column Percentages
- 18.12 Computing Percentages on Numeric Variables
- 18.13 Understanding How Missing Values Affect PROC TABULATE Output
- 18.14 Problems
- Chapter 19 Introducing the Output Delivery System
- Part 4
-
Chapter 20 Generating High-Quality Graphics
- 20.1 Introduction
- 20.2 Some Basic Concepts
- 20.3 Producing Simple Bar Charts Using PROC GCHART
- 20.4 Creating Pie Charts
- 20.5 Creating Bar Charts for a Continuous Variable
- 20.6 Creating Charts with Values Representing Categories
- 20.7 Creating Bar Charts Representing Sums
- 20.8 Creating Bar Charts Representing Means
- 20.9 Adding Another Variable to the Chart
- 20.10 Producing Scatter Plots
- 20.11 Connecting Points
- 20.13 Problems
-
Chapter 21 Using Advanced INPUT Techniques
- 21.1 Introduction
- 21.2 Handling Missing Values at the End of a Line
- 21.3 Reading Short Data Lines
- 21.4 Reading External Files with Lines Longer Than 256 Characters
- 21.5 Detecting the End of the File
- 21.6 Reading a Portion of a Raw Data File
- 21.7 Reading Data from Multiple Files
- 21.8 Reading Data from Multiple Files Using a FILENAME Statement
- 21.9 Reading External Filenames from a Data File
- 21.10 Reading Multiple Lines of Data to Form One Observation
- 21.11 Reading Data Conditionally (the Single Trailing @ Sign)
- 21.12 More Examples of the Single Trailing @ Sign
- 21.13 Creating Multiple Observations from One Line of Input
- 21.14 Using Variable and Informat Lists
- 21.15 Using Relative Column Pointers to Read a Complex Data Structure Efficiently
-
Chapter 22 Using Advanced Features of User-Defined Formats and Informats
- 22.1 Introduction
- 22.2 Using Formats to Recode Variables
- 22.3 Using Formats with a PUT Function to Create New Variables
- 22.4 Creating User-Defined Informats
- 22.5 Reading Character and Numeric Data in One Step
- 22.6 Using Formats (and Informats) to Perform Table Lookup
- 22.7 Using a SAS Data Set to Create a Format
- 22.8 Updating and Maintaining Your Formats
- 22.9 Using Formats within Formats
- 22.10 Multilabel Formats
- 22.11 Using the INPUTN Function to Perform a More Complicated Table Lookup
- 22.12 Problems
-
Chapter 23 Restructuring SAS Data Sets
- 23.1 Introduction
- 23.2 Converting a Data Set with One Observation per Subject to a Data Set with Several Observations per Subject: Using a DATA Step
- 23.3 Converting a Data Set with Several Observations per Subject to a Data Set with One Observation per Subject: Using a DATA Step
- 23.4 Converting a Data Set with One Observation per Subject to a Data Set with Several Observations per Subject: Using PROC TRANSPOSE
- 23.5 Converting a Data Set with Several Observations per Subject to a Data Set with One Observation per Subject: Using PROC TRANSPOSE
- 23.6 Problems
-
Chapter 24 Working with Multiple Observations per Subject
- 24.1 Introduction
- 24.2 Identifying the First or Last Observation in a Group
- 24.3 Counting the Number of Visits Using PROC FREQ
- 24.4 Counting the Number of Visits Using PROC MEANS
- 24.5 Computing Differences between Observations
- 24.6 Computing Differences between the First and Last Observation in a BY Group Using the LAG Function
- 24.7 Computing Differences between the First and Last Observation in a BY Group Using a RETAIN Statement
- 24.8 Using a Retained Variable to “Remember” a Previous Value
- 24.9 Problems
-
Chapter 25 Introducing the SAS Macro Language
- 25.1 Introduction
- 25.2 Macro Variables: What Are They?
- 25.3 Some Built-In Macro Variables
- 25.4 Assigning Values to Macro Variables with a %LET Statement
- 25.5 Demonstrating a Simple Macro
- 25.6 A Word about Tokens
- 25.7 Another Example of Using a Macro Variable as a Prefix
- 25.8 Using a Macro Variable to Transfer a Value between DATA Steps
- 25.9 Problems
-
Chapter 26 Introducing the Structured Query Language
- 26.1 Introduction
- 26.2 Some Basics
- 26.3 Joining Two Tables (Merge)
- 26.4 Left, Right, and Full Joins
- 26.5 Concatenating Data Sets
- 26.6 Using Summary Functions
- 26.7 Demonstrating an ORDER Clause
- 26.8 An Example of Fuzzy Matching
- 26.9 Problems
- Chapter 1 Solutions
- Chapter 2 Solutions
- Chapter 3 Solutions
- Chapter 4 Solutions
- Chapter 5 Solutions
- Chapter 6 Solutions
- Chapter 7 Solutions
- Chapter 8 Solutions
- Chapter 9 Solutions
- Chapter 10 Solutions
- Chapter 11 Solutions
- Chapter 12 Solutions
- Chapter 13 Solutions
- Chapter 14 Solutions
- Chapter 15 Solutions
- Chapter 16 Solutions
- Chapter 17 Solutions
- Chapter 18 Solutions
- Chapter 19 Solutions
- Chapter 20 Solutions
- Chapter 21 Solutions
- Chapter 22 Solutions
- Chapter 23 Solutions
- Chapter 24 Solutions
- Chapter 25 Solutions
- Chapter 26 Solutions
- Index
Product information
- Title: Learning SAS by Example
- Author(s):
- Release date: March 2007
- Publisher(s): SAS Institute
- ISBN: 9781599944265
You might also like
book
Learning SAS by Example
Learn to program SAS by example! Learning SAS by Example, A Programmer’s Guide, Second Edition, teaches …
book
Data Science from Scratch, 2nd Edition
To really learn data science, you should not only master the tools—data science libraries, frameworks, modules, …
book
Learning SQL, 3rd Edition
As data floods into your company, you need to put it to work right away—and SQL …
video
Learning SQL
Almost 3 Hours of Video Instruction Description Learning SQL LiveLessons Skill Level Beginner Intermediate What You …