/*--------------------------------------------------------------------*/ /* PROC TABULATE by Example */ /* by Lauren Haworth */ /* Copyright(c) 1999 by SAS Institute Inc., Cary, NC, USA */ /* SAS Publications order # 56514 */ /* ISBN 1-58025-358-X*/ /*-------------------------------------------------------------------*/ /* */ /* This material is provided "as is" by SAS Institute Inc. There */ /* are no warranties, expressed or implied, as to merchantability or */ /* fitness for a particular purpose regarding the materials or code */ /* contained herein. The Institute is not responsible for errors */ /* in this material as it now exists or will exist, nor does the */ /* Institute provide technical support for it. */ /*-------------------------------------------------------------------*/ /* Date last updated: 1Jun00 */ /*-------------------------------------------------------------------*/ /* Questions or problem reports concerning this material may be */ /* addressed to the author: */ /* */ /* SAS Institute Inc. */ /* Books by Users */ /* Attn: Lauren Haworth */ /* SAS Campus Drive */ /* Cary, NC 27513 */ /* */ /* */ /* If you prefer, you can send email to: sasbbu@sas.com */ /* Use this for subject field: */ /* Comments for Lauren Haworth */ /* */ /*-------------------------------------------------------------------*/ /**********************************************************/ /* CREATE DATASETS USED BY SAMPLE CODE */ /* To run the examples for a given chapter, */ /* (1) run the options, libname and proc format */ /* code below, and */ /* (2) create the dataset SAMPLES using the input */ /* statement below */ /* (3) create the datasets named for the chapter */ /* (CHPTxx) */ /* (4) run the code for the */ /* examples */ /**********************************************************/ options ls=132 nofmterr nocenter nodate nonumber FORMCHAR='|----|+|---'; libname sd2 "C:\BOOK\SAS"; PROC FORMAT; VALUE AGEFT LOW-<40='20-39' 40-<60='40-59' 60-HIGH='60+'; VALUE EDUC 0-11='1990; RUN; DATA CHPT10C; SET SAMPLES; GENDER=GENDNUM; DROP GENDCHAR GENDNUM; FORMAT GENDER GENDER.; RUN; DATA CHPT10D; SET SAMPLES; IF OCCUP IN(5,6,7,8) THEN OCCUP=OCCUP-4; ELSE IF OCCUP IN(9,10) THEN OCCUP=OCCUP-6; ELSE IF OCCUP IN(11,12) THEN OCCUP=OCCUP-8; IF OCCUP IN(1,2,3,4); IF RACE IN(1,2); IF EDUC<12 THEN EDUC=12; GENDER=GENDNUM; DROP GENDCHAR GENDNUM; FORMAT GENDER GENDER.; OUTPUT; IF _N_=1 THEN DO; EDUC=12; SEX=2; RACE=2; OCCUP=3; INCOME=23768.53; OUTPUT; END; RUN; DATA CHPT10E; SET SAMPLES; if occup=1 then course=101; else if occup=2 then course=104; else if occup=3 then course=109; else delete; score=50+(ranuni(11166)*50); GENDER=GENDNUM; DROP GENDCHAR GENDNUM; FORMAT GENDER GENDER.; RUN; DATA CHPT11; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; RUN; DATA CHPT11A; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; SAT=OTHERSAT; RETAIN COUNTF COUNTM; IF GENDNUM NE . AND YEAR NE . AND SAT NE .; YEAR=YEAR+2; IF YEAR=1987 THEN YEAR=1991; ELSE IF YEAR=1988 THEN YEAR=1993; IF _n_=1 THEN DO; COUNTF=0; COUNTM=0; END; IF GENDCHAR="Female" THEN DO; COUNTF+1; THEWT=1.25; IF COUNTF<=400 THEN OUTPUT; END; ELSE IF GENDCHAR="Male" THEN DO; COUNTM+1; THEWT=.83333; IF COUNTM<=600 THEN OUTPUT; END; RUN; DATA CHPT12; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT GENDNUM GENDER.; RUN; DATA CHPT13; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT GENDNUM GENDER.; IF OCCUP IN(1,2,3,4); if race=1 and mod(_N_,34)=0 then race=5; else if race=1 and mod(_N_,26)=0 then race=4; else if race=1 and mod(_N_,22)=0 then race=3; else if race=1 and mod(_N_,14)=0 then race=2; format race race5ft.; RUN; DATA CHPT13A; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT GENDNUM GENDER.; IF OCCUP IN(1,2,3,4); YEAR=YEAR+(ROUND(RANUNI(11166)*20)); IF YEAR>1998 THEN YEAR=YEAR-30; IF YEAR>=1975; FORMAT AGE AGEFT.; RUN; DATA CHPT14; SET SAMPLES; RENAME GENDCHAR=GENDER; DROP GENDNUM; FORMAT SECTOR SECTOR. EDUC EDUC.; DATE='1JAN96'D+(YRSEDUC*30); UNION=UNION-1; RUN; DATA CHPT14A; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; DATE='1JAN96'D+(YRSEDUC*30); UNION=UNION-1; RUN; DATA CHPT15; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; RUN; DATA CHPT15A; SET SAMPLES; RENAME GENDCHAR=GENDER; DROP GENDNUM; FORMAT SECTOR SECTOR. EDUC EDUC.; RUN; DATA CHPT15B; SET CHPT15; if union then ans1=1; else ans1=0; if gender=2 then ans2=1; else ans2=0; if numkids>0 then ans3=1; else ans3=0; if occup>3 then ans4=1; else ans4=0; if sector=1 then ans5=1; else ans5=0; label ans1='Prices' ans2='Service' ans3='Location' ans4='Hours' ans5='Variety'; FORMAT ANS1-ANS5 YESNOFT.; run; DATA CHPT15C; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; IF OCCUP IN(11,12) THEN DELETE; RUN; DATA CHPT15D; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; Q1=FLOOR(RANUNI(11166)*5)+1; IF (Q1=1 AND _N_<30) OR (Q1=3 AND _N_<250) OR (Q1=4 AND _N_<500) OR (Q1=5 AND _N_<700); RUN; DATA CHPT15E; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; IF OCCUP IN(11,12) THEN DELETE; IF OCCUP=1 AND FULLTIME=2 THEN INCOME=INCOME*3; RUN; DATA CHPT15F; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; IF OCCUP IN(11,12) THEN DELETE; IF GENDNUM=1 AND _N_<300 THEN FULLTIME=2; CHANGEWT=RANUNI(11166)/100; IF RACE=2 AND GENDNUM=1 THEN CHANGEWT=CHANGEWT*-1; LABEL CHANGEWT='CHANGE IN WEIGHT'; RUN; DATA CHPT16; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; IF OCCUP>4 THEN OCCUP=OCCUP-3; IF OCCUP>4 THEN OCCUP=OCCUP-4; IF OCCUP IN(1,2,3,4); if race=1 and mod(_N_,34)=0 then race=5; else if race=1 and mod(_N_,26)=0 then race=4; else if race=1 and mod(_N_,22)=0 then race=3; else if race=1 and mod(_N_,14)=0 then race=2; format race race5ft.; YEAR=YEAR+2; EMPYEARS=(AGE/4)-occup-sector-genDNUM; RUN; DATA CHPT17; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; IF OCCUP>4 THEN OCCUP=OCCUP-3; IF OCCUP>4 THEN OCCUP=OCCUP-4; IF OCCUP IN(1,2,3,4); if race=1 and mod(_N_,34)=0 then race=5; else if race=1 and mod(_N_,26)=0 then race=4; else if race=1 and mod(_N_,22)=0 then race=3; else if race=1 and mod(_N_,14)=0 then race=2; EMPYEARS=(AGE/4)-occup-sector-gendnum; if numkids>2 then ownhome='Owns Home'; format race newrace. age ageft.; RUN; DATA CHPT17A; SET SAMPLES; RENAME GENDNUM=GENDER; DROP GENDCHAR; FORMAT SECTOR SECTOR. EDUC EDUC. GENDNUM GENDER.; IF OCCUP>4 THEN OCCUP=OCCUP-3; IF OCCUP>4 THEN OCCUP=OCCUP-4; IF OCCUP IN(1,2,3,4); if race=1 and mod(_N_,34)=0 then race=5; else if race=1 and mod(_N_,26)=0 then race=4; else if race=1 and mod(_N_,22)=0 then race=3; else if race=1 and mod(_N_,14)=0 then race=2; EMPYEARS=(AGE/4)-occup-sector-gendnum; format race newrace. age ageft.; if occup>3 then ownhome='Owns Home'; else ownhome='Rents Home'; format race newrace.; RUN; DATA CHPT20; SET SAMPLES; GENDER=GENDNUM; DROP GENDCHAR GENDNUM; FORMAT GENDER GENDER. AGE AGEFT.; IF OCCUP>4 THEN OCCUP=OCCUP-3; IF OCCUP>4 THEN OCCUP=OCCUP-4; IF OCCUP IN(1,2,3,4); EMPYEARS=(AGE/4)-occup-sector-genDNUM; EMPYEARS=ABS(EMPYEARS); IF EMPYEARS=0 THEN EMPYEARS=EMPYEARS+4; RUN; DATA CHPT20A; FORMAT EDUC EDFT. MARITAL MARFT. FNAME $10. LNAME $15.; INPUT FNAME $ LNAME $ YEAR AGE EDUC INCOME MARITAL NUMKIDS; CARDS; JOHN JOHNSON 1998 40 15 0 0 0 JOHN JOHNSON 1999 41 156 32000 0 0 JANE DOE 1998 28 17 75000 1 0 JANE DOE 1999 29 17 77000 1 0 TIM SAUNDERS 1998 21 12 15000 1 0 TIM SAUNDERS 1999 22 12 16000 1 1 TINA SMITH 1998 20 12 5000 1 2 TINA SMITH 1999 21 12 4000 1 2 TOM LANDRY 1998 34 16 65400 2 0 TOM LANDRY 1999 35 16 69200 2 0 DONNA JONES 1998 38 16 54000 2 3 DONNA JONES 1999 39 16 50000 1 4 DOUG ANDERSON 1998 57 16 78000 1 5 DOUG ANDERSON 1999 58 16 80000 1 5 SAMANTHA LEE 1998 55 16 89000 1 1 SAMANTHA LEE 1999 56 16 0 1 1 ; RUN; PROC SORT DATA=CHPT20A; BY FNAME LNAME; RUN; DATA CHPT20B; SET SAMPLES; GENDER=GENDNUM; DROP GENDCHAR GENDNUM; FORMAT GENDER GENDER. AGE AGEFT.; IF OCCUP>4 THEN OCCUP=OCCUP-3; IF OCCUP>4 THEN OCCUP=OCCUP-4; IF OCCUP IN(1,2,3,4); IF AGE<60; REGION=SECTOR; if REGION in(1,2,3,4); format REGION REGION.; IF INCOME=. THEN INCOME=(AGE*500)+(EDUC*10000)-(RACE*10000); RUN; DATA CHPT20C; SET SAMPLES; GENDER=GENDNUM; DROP GENDCHAR GENDNUM; FORMAT GENDER GENDER. AGE AGEFT.; IF OCCUP>4 THEN OCCUP=OCCUP-3; IF OCCUP>4 THEN OCCUP=OCCUP-4; IF OCCUP IN(1,2,3,4); IF GENDER=2 THEN SCORE1=RANNOR(122870)*10; ELSE SCORE1=RANNOR(062169)*30; IF AGE<40 THEN SCORE2=RANNOR(100541)*10; ELSE SCORE2=RANNOR(081440)*30; IF GENDER=2 AND AGE>30 THEN SCORE3=INCOME/2300; ELSE SCORE3=RANNOR(11166)*50; SCORE1=SCORE1+10; SCORE2=SCORE2+10; SCORE3=SCORE3+10; AGEGRP=PUT(AGE, AGEFT.); RUN; PROC SORT DATA=CHPT20C; BY AGEGRP GENDER; RUN; DATA CHPT23; SET SAMPLES; GENDER=GENDNUM; DROP GENDCHAR GENDNUM; FORMAT GENDER GENDER.; RUN; DATA CHPT24; SET SAMPLES; GENDER=GENDNUM; IF GENDER=2 THEN GENDER=1; ELSE IF GENDER=1 THEN GENDER=2; DROP GENDCHAR GENDNUM; FORMAT GENDER GENDER.; IF OCCUP>4 THEN OCCUP=OCCUP-3; IF OCCUP>4 THEN OCCUP=OCCUP-4; IF OCCUP IN(1,2,3,4); if race=1 and mod(_N_,34)=0 then race=5; else if race=1 and mod(_N_,26)=0 then race=4; else if race=1 and mod(_N_,22)=0 then race=3; else if race=1 and mod(_N_,14)=0 then race=2; format race NEWRACE.; YEAR=YEAR+2; IF AGE>45 THEN UNION=.; IF AGE<30 THEN HOURLY=.; IF AGE<30 THEN GRADE=4; ELSE IF AGE<40 THEN GRADE=3; ELSE IF AGE<50 THEN GRADE=2; ELSE GRADE=0; FORMAT GRADE GRADEFT. AGE AGEFT.; EMPYEARS=(AGE/4)-occup-sector-GENDNUM; THEWT=WEIGHT; RUN; PROC FORMAT; VALUE LONGFMT 1='Widgets, Gadgets, Whatchamacallits, and Thigamagigs' 2='Other Stuff'; RUN; DATA TheWordyDataset; SET CHPT24; IF RACE+OCCUP IN(2,3,4,5); ReallyLongVariable=gender; format ReallyLongVariable LONGFMT.; ReallyLongVariableToo=race+occup; shorty=income/10-year; label shorty='This is a short variable with a label so long it is completely ridiculous'; RUN; DATA OTHERDATA; SET CHPT24; GRADE=GRADE-RACE; GRADE=GRADE+OCCUP; IF GRADE IN(0,1,2,3,4,7); RETAIN COUNTER 0; IF GRADE=7 THEN COUNTER+1; IF GRADE=7 AND COUNTER>2 THEN DELETE; RUN; DATA CHPT24A; SET OTHERDATA; IF GRADE=7 OR (GRADE=4 AND OCCUP=1) THEN GRADE=.; IF RACE=5 THEN RACE=.; RUN; data CHPT24B; set CHPT24; if union then ans='Prices '; else if numkids>0 then ans='Location'; else if occup=3 or sector=2 then ans='Hours'; IF AGE<40 AND RACE=1 THEN AGE=61; run; DATA CHPT24C; SET CHPT24 (KEEP=GENDER MARITAL RACE); IF MARITAL IN(1,2,3) THEN MARITAL=1; ELSE IF MARITAL=4 THEN MARITAL=2; ELSE IF MARITAL IN(5,6) THEN MARITAL=3; ELSE IF MARITAL=7 THEN MARITAL=4; FORMAT MARITAL MARFT. RACE RACEFT. GENDER GENDERFT.; IF RACE=2 AND GENDER=2 THEN MARITAL=.; RUN; DATA CHPT24D; SET CHPT24; GRADE=GRADE-RACE; GRADE=GRADE+OCCUP; IF GRADE IN(0,1,2,3,4); RUN; DATA CHPT24E; SET SAMPLES; if income<0 then income=0; rename income=Income age=Age; if gendnum=1 then Gender='Female'; else if gendnum=2 then Gender='Male'; Education=educ-27; if occup in(1,2,3,4) then Division=occup; IF OCCUP>4 THEN Division=OCCUP-4; IF Division>4 THEN Division=Division-3; IF Division IN(1,2,3,4); Hourly=income/2050; EmpYears=(AGE/4)-occup-sector-gendnum; if EmpYears<0 then EmpYears=0; JobSatisfaction=ROUND(5+(-1*division)+gendnum+(.01*hourly)+(.1*empyears),1); IF JobSatisfaction>5 THEN JobSatisfaction=JobSatisfaction-3; LABEL Hourly='Hourly rate' JobSatisfaction='Job satisfaction' EmpYears='Years of Employment'; format income hourly 8. educ edft. AGE AGEFT. Division divft. empyears empyrs. JOBCLASS $13.; if EmpYears>10 then JobClass=' Managerial'; else if EmpYears>5 then JobClass=' Clerical'; else JobClass='Manufacturing'; RUN; DATA CHPT24F; SET CHPT24E (RENAME=(GENDER=GENDTEMP)); IF GENDTEMP='Female' THEN GENDER=1; IF GENDTEMP='Male' THEN GENDER=2; FORMAT GENDER GENDREV.; if union then ans1=1; else ans1=0; if gender=2 then ans2=1; else ans2=0; if numkids>0 then ans3=1; else ans3=0; if occup>3 then ans4=1; else ans4=0; if sector=1 then ans5=1; else ans5=0; label ans1='Prices' ans2='Service' ans3='Location' ans4='Hours' ans5='Variety'; FORMAT ANS1-ANS5 YESNOFT.; RUN; DATA TEMPANS; SET CHPT24F; ARRAY ANS{5} ANS1-ANS5; IF SUM(ANS1,ANS2,ANS3,ANS4,ANS5)>0; DO A=1 TO 5; IF ANS{A} NE . THEN DO; RESP=A; ANSWER=ANS{A}; OUTPUT; END; END; RUN; PROC SUMMARY DATA=TEMPANS NWAY; CLASS RESP; VAR ANSWER; OUTPUT OUT=CHPT24G MEAN=; RUN; PROC SORT DATA=CHPT24G; BY DESCENDING ANSWER; RUN; /**********************************************************/ /* Chapter 1: Why Use PROC TABULATE? */ /**********************************************************/ DATA TEMP; SET CHPT01; RUN; /* Example Without Using PROC TABULATE*/ /* Output 1.1 */ PROC MEANS; VAR AGE INCOME EDUC; RUN; /* Output 1.2 */ PROC MEANS; BY GENDER; VAR AGE INCOME EDUC; RUN; /* Example With PROC TABULATE */ /* Output 1.3 */ PROC TABULATE; CLASS GENDER; VAR AGE INCOME EDUC; TABLE (AGE INCOME EDUC)*MEAN, GENDER ALL; RUN; /**********************************************************/ /* Chapter 3: Before You Start Writing PROC TABULATE Code */ /**********************************************************/ DATA TESTDAT; SET CHPT03; RUN; /* Examining the Data*/ /* Output 3.1 */ PROC CONTENTS DATA=TESTDAT; RUN; /* Output 3.2 */ PROC PRINT DATA=TESTDAT (OBS=50); VAR ID EDUC INCOME AGE; FORMAT _ALL_; TITLE 'SAMPLE RECORDS FOR REVIEW'; RUN; /* Output 3.3 */ PROC FREQ DATA=TESTDAT; TABLES EDUC INCOME AGE; TITLE 'FREQUENCIES FOR REVIEW'; RUN; /* Output 3.4 */ PROC FORMAT; VALUE ED2FT 0-15='NO COLLEGE DEGREE' 16='COLLEGE DEGREE'; RUN; TITLE; PROC FREQ DATA=TESTDAT; WHERE EDUC<=16; TABLES EDUC; FORMAT EDUC ED2FT.; RUN; /* Output 3.5 */ PROC MEANS DATA=TESTDAT; WHERE EDUC<=16; VAR INCOME; RUN; /**********************************************************/ /* Chapter 4: Creating One-Dimensional Tables */ /**********************************************************/ PROC FORMAT; VALUE EDUC 0-11='=12; RUN; /* Output not shown in book */ PROC TABULATE DATA=TEMP; CLASS RACE GENDER EDUC FULLTIME SECTOR; VAR INCOME; TABLE SECTOR*RACE*EDUC, FULLTIME, GENDER*INCOME*(MEAN MIN MAX); RUN; /* Output not shown in book */ PROC TABULATE DATA=TEMP; CLASS RACE GENDER EDUC FULLTIME SECTOR; VAR INCOME; TABLE FULLTIME, SECTOR*RACE*EDUC, GENDER*INCOME*(MEAN MIN MAX); RUN; /* Output 6.5 */ PROC TABULATE DATA=TEMP; CLASS EDUC RACE GENDER; VAR INCOME; TABLE EDUC ALL, RACE*GENDER, INCOME*(MEAN MIN MAX); RUN; /* Putting a Title in Each Table*/ DATA TEMP; SET CHPT06; IF RACE IN(1,2); RUN; /* Output 6.6 */ PROC TABULATE DATA=TEMP; CLASS RACE GENDER; VAR SAT; TABLE RACE, GENDER*SAT / BOX="Customer Survey Data"; RUN; /* Output 6.7 */ PROC TABULATE DATA=TEMP; CLASS RACE GENDER; VAR SAT; TABLE RACE, GENDER*SAT / BOX=SAT; RUN; /* Output 6.8 */ PROC TABULATE DATA=TEMP; CLASS RACE GENDER CUSTTYPE; VAR SAT; TABLE CUSTTYPE, RACE, GENDER*SAT / BOX=_PAGE_; RUN; /* Fitting Tables to the Page*/ PROC FORMAT; VALUE EDUC 0-11=', EDUC; TITLE 'EXAMPLE SHOWING ROW PERCENTAGES'; RUN; /* Output 7.6 */ PROC TABULATE DATA=TEMP; CLASS OCCUP EDUC; TABLE OCCUP*PCTN, EDUC; TITLE 'EXAMPLE SHOWING ROW PERCENTAGES'; RUN; /* Adding Row Totals*/ TITLE; /* Output 7.7 */ PROC TABULATE DATA=TEMP; CLASS OCCUP EDUC; TABLE OCCUP, EDUC ALL; RUN; /* Output 7.8 */ PROC TABULATE DATA=TEMP; CLASS OCCUP EDUC; TABLE OCCUP, (EDUC ALL)*PCTN; RUN; /* Adding Column Totals*/ /* Output 7.9 */ PROC TABULATE DATA=TEMP; CLASS OCCUP EDUC; TABLE OCCUP ALL, EDUC; RUN; /* Output 7.10 */ PROC TABULATE DATA=TEMP; CLASS OCCUP EDUC; TABLE OCCUP ALL, EDUC*PCTN; RUN; /**********************************************************/ /* Chapter 8: Handling Percentages With Complex Denominators */ /**********************************************************/ /* Percentages for Multiple Row Variables*/ DATA TEMP; SET CHPT08; RUN; /* Output not shown in book */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE (RACE CUSTTYPE)*GENDER, SIZE*N; RUN; /* Output 8.1 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE (RACE CUSTTYPE)*GENDER, SIZE*PCTN; RUN; /* Output 8.2 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE (RACE CUSTTYPE)*GENDER, SIZE*PCTN; RUN; /* Percentages for Multiple Column Variables*/ /* Output not shown in book */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE RACE*GENDER, (CUSTTYPE SIZE)*N; RUN; /* Output 8.3 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE RACE*GENDER, (CUSTTYPE SIZE)*PCTN; RUN; /* Output 8.4 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE RACE*GENDER, (CUSTTYPE SIZE)*PCTN; RUN; /* Output 8.5 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE RACE*GENDER, (CUSTTYPE ALL SIZE ALL)*PCTN; RUN; /* Picking the Right Denominator*/ /* Output 8.6 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE RACE*GENDER, (CUSTTYPE SIZE)*PCTN; RUN; /* Output 8.7 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE RACE*GENDER, (CUSTTYPE SIZE)*PCTN; RUN; /* Output 8.8 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE RACE*GENDER, (CUSTTYPE SIZE)*PCTN; RUN; /* Percentages Mixed With Oher Statistics*/ DATA TEMP; SET CHPT08; IF SAT>5 THEN SAT=SAT-5; RUN; /* Output 8.9 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE SAT; VAR INCOME; TABLE GENDER RACE, SAT*PCTN INCOME*MEAN; RUN; /* Output 8.10 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE SAT; VAR INCOME; TABLE GENDER, SAT*PCTSUM*INCOME MEAN*INCOME; RUN; /* Output 8.11 */ PROC TABULATE DATA=TEMP F=10.2; CLASS GENDER RACE SAT; TABLE GENDER*PCTN RACE*N, SAT / rts=20; RUN; /* Percentages With Subtotals*/ /* Output 8.12 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE; TABLE RACE*GENDER ALL, CUSTTYPE*PCTN; RUN; /* Output 8.14 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE; TABLE RACE*(GENDER ALL) ALL, CUSTTYPE*PCTN; RUN; /* Percentage Subtotals on Both Dimensions*/ /* Output 8.15 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE RACE*(GENDER ALL) ALL, (CUSTTYPE*(SIZE ALL) ALL)*N; RUN; /* Output 8.18 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE CUSTTYPE SIZE; TABLE RACE*(GENDER ALL) ALL, (CUSTTYPE*(SIZE ALL) ALL)* PCTN; RUN; /* Percentages for Three-Dimensional Tables*/ PROC FORMAT; VALUE SATFT 1,2,3='POOR-GOOD' 4,5='VERY GOOD-EXCELLENT'; RUN; DATA TEMP; SET CHPT08; FORMAT SAT SATFT.; IF SAT>5 THEN SAT=SAT-5; RUN; /* Output 8.17 */ PROC TABULATE DATA=TEMP; CLASS SAT RACE GENDER; TABLE SAT ALL, RACE ALL, (GENDER ALL)* PCTN; RUN; /* Percentages for Analysis Variables*/ DATA TEMP; SET CHPT08; NEWINC=INCOME*2*ABS(RANUNI(11166)); LABEL NEWINC='New Income' INCOME='Old Income'; RUN; /* Output 8.18 */ PROC TABULATE DATA=TEMP; CLASS GENDER EDUC; VAR INCOME NEWINC; TABLE GENDER*EDUC, INCOME*MEAN NEWINC*MEAN; RUN; /* Output 8.19 */ PROC TABULATE DATA=TEMP; CLASS GENDER EDUC; VAR INCOME NEWINC; TABLE GENDER*EDUC, INCOME*MEAN NEWINC*MEAN NEWINC*PCTSUM; RUN; /**********************************************************/ /* Chapter 9: Handling Missing Data */ /**********************************************************/ /* Missing data: how to find it*/ DATA TEMP; SET CHPT09; RUN; PROC FORMAT; VALUE UNION 0='Non-Union' 1='Union'; RUN; /* Output 9.1 */ PROC TABULATE DATA=TEMP; CLASS OCCUP UNION; VAR NUMEMP; TABLE OCCUP*UNION ALL, NUMEMP; RUN; /* Output 9.2 */ PROC TABULATE DATA=TEMP MISSING; CLASS OCCUP UNION; VAR NUMEMP; TABLE OCCUP*UNION ALL, NUMEMP; RUN; /* Reporting the missing data*/ /* Output 9.3 */ PROC TABULATE DATA=TEMP; CLASS OCCUP UNION; VAR NUMEMP; TABLE OCCUP*NUMEMP, UNION*N; RUN; /* Output 9.4 */ PROC TABULATE DATA=TEMP; CLASS OCCUP UNION; VAR NUMEMP; TABLE OCCUP*NUMEMP, UNION*NMISS; RUN; /* Output 9.5 */ PROC TABULATE DATA=TEMP; CLASS OCCUP UNION; VAR NUMEMP; TABLE OCCUP*NUMEMP, UNION*(N NMISS); RUN; /* Recoding the data*/ DATA TEMP; SET CHPT09; UNION=UNION+1; RUN; /* Output 9.6 */ DATA FIXED; SET TEMP; IF UNION=. THEN UNION=0; RUN; PROC FORMAT; VALUE MISSFT 0='Unknown' 1='Non-Union' 2='Union'; RUN; PROC TABULATE DATA=FIXED; CLASS OCCUP UNION; VAR NUMEMP; FORMAT UNION MISSFT.; TABLE OCCUP*UNION, NUMEMP; RUN; DATA TEMP; SET TEMP; OUTPUT; IF _N_=1 THEN DO; OCCUP=.; NUMEMP=2500; OUTPUT; END; RUN; /* Output 9.7 */ PROC FORMAT; VALUE MISSFT .='Unknown' 1='Non-Union' 2='Union'; RUN; PROC TABULATE DATA=TEMP MISSING; CLASS OCCUP UNION; VAR NUMEMP; FORMAT UNION MISSFT.; TABLE OCCUP*UNION, NUMEMP; RUN; /* Formatting missing values*/ DATA TEMP; SET CHPT09; RUN; /* Output 9.8 */ PROC TABULATE DATA=TEMP; CLASS OCCUP UNION; VAR NUMEMP; TABLE OCCUP*UNION ALL, NUMEMP; RUN; /* Output 9.9 */ PROC TABULATE DATA=TEMP; CLASS OCCUP UNION; VAR NUMEMP; TABLE OCCUP*UNION ALL, NUMEMP / MISSTEXT="no data"; RUN; /* Three-dimensional tables with missing data*/ /* Output 9.10 */ PROC TABULATE DATA=TEMP; CLASS UNION OCCUP GENDER; VAR NUMEMP; TABLE GENDER, UNION, OCCUP*NUMEMP*SUM; RUN; /* Output 9.11 */ PROC TABULATE DATA=TEMP; CLASS UNION OCCUP GENDER; VAR NUMEMP; TABLE GENDER, UNION, OCCUP*NUMEMP*SUM / PRINTMISS; RUN; /* Breaking up the table*/ DATA TEMP; SET CHPT09A; RUN; /* Output 9.12 */ PROC TABULATE DATA=TEMP MISSING; CLASS MARITAL NUMKIDS EDUC; TABLE EDUC ALL, (MARITAL NUMKIDS)*N; RUN; /* Output 9.13 */ PROC TABULATE DATA=TEMP; CLASS MARITAL EDUC; TABLE EDUC ALL, MARITAL*N; RUN; PROC TABULATE DATA=TEMP; CLASS NUMKIDS EDUC; TABLE EDUC ALL, NUMKIDS*N; RUN; /* Data step tricks*/ DATA TEMP; SET CHPT09B; RUN; /* Output 9.14 */ PROC TABULATE DATA=TEMP; CLASS OCCUP SECTOR; VAR NUMEMP; TABLE OCCUP ALL, SECTOR*NUMEMP; RUN; DATA TEMP; SET CHPT09B (RENAME=(SECTOR=SECTNUM)); IF SECTNUM NE .; FORMAT SECTOR $10.; SECTOR=PUT(SECTNUM,SECTOR.); RUN; /* Output 9.1 */ DATA FIXIT; SET TEMP; OUTPUT; IF _N_=1 THEN DO N=1 TO 4; OCCUP=N; SECTOR="Non-Profit"; NUMEMP=0; OUTPUT; END; RUN; PROC TABULATE DATA=FIXIT; CLASS OCCUP SECTOR; VAR NUMEMP; TABLE OCCUP ALL, SECTOR*NUMEMP; RUN; /**********************************************************/ /* Chapter 10: Modifying Row and Column Headings */ /**********************************************************/ DATA TEMP; SET CHPT10; RUN; /* Modifying variable labels*/ /* Output 10.1 */ PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE OCCUP ALL, (FULLTIME ALL)*INCOME*MEAN; LABEL OCCUP='Occupation' FULLTIME='Employment Status'; KEYLABEL ALL='TOTAL'; RUN; /* Output 10.2 */ PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE OCCUP="Occupation" ALL="All Occupations", (FULLTIME="Employment Status" ALL="Total")*INCOME*MEAN; RUN; /* Modifying statistic labels*/ /* Output 10.3 */ PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE OCCUP, FULLTIME*INCOME*(N MEAN STD); RUN; /* Output 10.4 */ PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE OCCUP, FULLTIME*INCOME* (N="NUMBER OF OBS." MEAN STD="STANDARD DEVIATION"); RUN; /* Another way to modify statistic labels*/ /* Output 10.5 */ PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE OCCUP, FULLTIME*INCOME*(N MEAN STD); KEYLABEL N="NUMBER OF OBS." STD="STANDARD DEVIATION"; RUN; DATA TEMP; SET CHPT10A; RUN; /* Output 10.6 */ PROC TABULATE DATA=TEMP; CLASS EDUC RACE FULLTIME; VAR AGE; TABLE EDUC*(N MEAN) FULLTIME*(NMISS MEAN), RACE*AGE; KEYLABEL MEAN="Average"; RUN; /* Hiding statistic labels*/ DATA TEMP; SET CHPT10B; RUN; /* Output 10.7 */ PROC TABULATE DATA=TEMP; CLASS YEAR FULLTIME GENDER; VAR INCOME; TABLE YEAR, FULLTIME*GENDER*INCOME*MEAN; RUN; /* Output 10.8 */ PROC TABULATE DATA=TEMP; CLASS YEAR FULLTIME GENDER; VAR INCOME; TABLE YEAR, FULLTIME*GENDER*INCOME*MEAN=" " / BOX="MEAN"; RUN; /* Hiding variable labels*/ /* Output 10.9 */ PROC TABULATE DATA=TEMP; CLASS YEAR FULLTIME GENDER; VAR INCOME; TABLE YEAR, FULLTIME*GENDER=" "*INCOME*MEAN=" " / BOX="Mean"; RUN; DATA TEMP; SET CHPT10B; IF FULLTIME=2 THEN FULLTIME=1; ELSE IF FULLTIME IN(3,4,5) THEN FULLTIME=2; RUN; /* Output 10.10 */ PROC FORMAT; VALUE FULLTIME 1="Employed Full-Time" 2="Employed Part-Time"; RUN: PROC TABULATE DATA=TEMP; CLASS YEAR FULLTIME GENDER; VAR INCOME; TABLE YEAR=" ", FULLTIME=" "*GENDER=" "*INCOME=" "*MEAN=" " / BOX="Mean Income"; FORMAT FULLTIME FULLTIME.; RUN; /* Modifying row headings*/ DATA TEMP; SET CHPT10C; RUN; PROC FORMAT; VALUE FULLTIME 2='Full-time' 3,4,5='Part-time'; RUN; /* Output 10.11 */ PROC TABULATE DATA=TEMP; CLASS EDUC GENDER FULLTIME; VAR INCOME; TABLE EDUC="Education"*GENDER=" "*INCOME=" "*MEAN=" ", FULLTIME=" " / BOX="Mean Income"; RUN; /* Output 10.12 */ PROC TABULATE DATA=TEMP; CLASS EDUC GENDER FULLTIME; VAR INCOME; TABLE EDUC="Education"*GENDER=" "*INCOME=" "*MEAN=" ", FULLTIME=" " / BOX="Mean Income" ROW=FLOAT; RUN; /* Modifying row heading widths*/ DATA TEMP; SET CHPT10; RUN; /* Output 10.13 */ OPTIONS LINESIZE=132; PROC TABULATE DATA=TEMP; CLASS EDUC GENDER OCCUP; VAR INCOME; TABLE EDUC="Education"*GENDER=" ", OCCUP="Occupation"*INCOME=" "*MEAN=" " / BOX="Mean Income"; RUN; /* Output 10.14 */ PROC TABULATE DATA=TEMP; CLASS EDUC GENDER OCCUP; VAR INCOME; TABLE EDUC="Education"*GENDER=" ", OCCUP="Occupation"*INCOME=" "*MEAN=" " / BOX="Mean Income" RTS=24; RUN; /* Modifying row heading indents*/ DATA TEMP; SET CHPT10D; RUN; /* Output 10.15 */ PROC TABULATE DATA=TEMP; CLASS EDUC GENDER RACE OCCUP; VAR INCOME; TABLE EDUC="Education"*GENDER=" "*RACE=" ", OCCUP="Occupation"*INCOME=" "*MEAN=" " / BOX="Mean Income" RTS=32; RUN; /* Output 10.16 */ PROC TABULATE DATA=TEMP; CLASS EDUC GENDER RACE OCCUP; VAR INCOME; TABLE EDUC="Education"*GENDER=" "*RACE=" ", OCCUP="Occupation"*INCOME=" "*MEAN=" " / BOX="Mean Income" RTS=20 INDENT=5; RUN; /* Modifying column widths*/ DATA TEMP; SET CHPT10C; IF RACE IN(1,2); IF EDUC<12 THEN EDUC=12; RUN; PROC FORMAT; VALUE FULLTIME 2="Employed Full-Time" 3,4,5="Employed Part-Time"; RUN: /* Output 10.17 */ PROC TABULATE DATA=TEMP FORMAT=8.; CLASS EDUC RACE FULLTIME; VAR INCOME; TABLE EDUC="Education"*RACE=" ", FULLTIME=" "*INCOME=" "*(N MEAN) / BOX="Income"; RUN; /* Output 10.18 */ PROC TABULATE DATA=TEMP FORMAT=COMMA12.; CLASS EDUC RACE FULLTIME; VAR INCOME; TABLE EDUC="Education"*RACE=" ", FULLTIME=" "*INCOME=" "*(N SUM) / BOX="Income"; RUN; /* Output 10.19 */ PROC TABULATE DATA=TEMP FORMAT=7.4; CLASS EDUC RACE FULLTIME; VAR RATIO; TABLE EDUC="Education"*RACE=" ", FULLTIME=" "*RATIO=" "*(MEAN STD) / BOX="Ratio" RTS=22; RUN; /* Ordering the headings*/ PROC FORMAT; VALUE SATFT 1='POOR=1' 2='FAIR=2' 3='GOOD=3' 4='VERY GOOD=4' 5='EXCELLENT=5'; RUN; DATA TEMP; SET SAMPLES; SAT=OTHERSAT; IF SAT>5 THEN SAT=SAT-5; FORMAT SAT SATFT.; GENDER=GENDNUM; FORMAT GENDER GENDER.; RUN; PROC SORT DATA=TEMP; BY DESCENDING SAT; RUN; /* Output 10.20 */ PROC TABULATE DATA=TEMP ORDER=INTERNAL; CLASS GENDER SAT; TABLE GENDER=' ', SAT*N / RTS=15; RUN; /* Output 10.21 */ PROC TABULATE DATA=TEMP ORDER=DATA; CLASS GENDER SAT; TABLE GENDER=' ', SAT*N / RTS=15; RUN; /* Output 10.22 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS GENDER SAT; TABLE GENDER=' ', SAT*N / RTS=15; RUN; /* Output 10.23 */ PROC TABULATE DATA=TEMP ORDER=FREQ; CLASS GENDER SAT; TABLE GENDER=' ' ALL, SAT*N / RTS=15; RUN; /* Reordering the headings*/ PROC FORMAT; VALUE COURSEFT 101="Writing" 104="Arithmetic" 109="Reading"; RUN; DATA TEMP; SET CHPT10E; RUN; /* Output 10.24 */ PROC TABULATE DATA=TEMP; CLASS COURSE GENDER; FORMAT COURSE COURSEFT.; VAR SCORE; TABLE COURSE*MEAN=" ", (GENDER=" " ALL)*SCORE="Mean Score" / ROW=FLOAT; RUN; /* Output 10.25 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS COURSE GENDER; FORMAT COURSE COURSEFT.; VAR SCORE; TABLE COURSE*MEAN=" ", (GENDER=" " ALL)*SCORE="Mean Score" / ROW=FLOAT; RUN; /* Output 10.26 */ PROC FORMAT; VALUE COURSEFT 109=" Reading" 101=" Writing" 104="Arithmetic"; RUN; PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS COURSE GENDER; FORMAT COURSE COURSEFT.; VAR SCORE; TABLE COURSE*MEAN=" ", (GENDER=" " ALL)*SCORE="Mean Score" / ROW=FLOAT; RUN; /**********************************************************/ /* Chapter 11: Formatting Table Values */ /**********************************************************/ /* Using appropriate formats - I*/ DATA TEMP; SET CHPT11; IF OCCUP IN(1,2,3,4); RUN; /* Output 11.1 */ PROC TABULATE DATA=TEMP; CLASS SECTOR OCCUP; VAR INCOME; TABLE OCCUP=' ', SECTOR=' '*INCOME*(N MEAN); RUN; /* Output 11.2 */ PROC TABULATE DATA=TEMP FORMAT=DOLLAR10.; CLASS SECTOR OCCUP; VAR INCOME; TABLE OCCUP=' ', SECTOR=' '*INCOME*(N MEAN); RUN; /* Output 11.3 */ PROC TABULATE DATA=TEMP; CLASS SECTOR OCCUP; VAR INCOME; TABLE OCCUP=' ', SECTOR=' '*INCOME*(N*F=6. MEAN*F=DOLLAR10.); RUN; /* Using Appropriate Formats - II*/ DATA TEMP; SET CHPT11; RUN; /* Output 11.4 */ PROC TABULATE DATA=TEMP; CLASS EDUC; VAR AGE INCOME; TABLE AGE*F=6.1 INCOME*F=DOLLAR10., EDUC*MEAN; RUN; /* Output 11.5 */ PROC TABULATE DATA=TEMP; CLASS EDUC; VAR AGE INCOME; TABLE AGE*F=6.1 INCOME*F=DOLLAR10., EDUC*(N MEAN); RUN; /* Output 11.6 */ PROC TABULATE DATA=TEMP; CLASS EDUC; VAR AGE INCOME; TABLE AGE INCOME, EDUC*(N*F=8. MEAN*F=8.1); RUN; /* Output 11.7 */ PROC TABULATE DATA=TEMP; CLASS EDUC; VAR AGE INCOME; TABLE AGE*F=6.1 INCOME*F=DOLLAR10., EDUC*(N*F=6. MEAN); RUN; /* Formatting percentages*/ DATA TEMP; SET CHPT11; IF OCCUP IN(1,2,3,4); RUN; /* Output 11.8 */ PROC TABULATE DATA=TEMP; CLASS OCCUP GENDER; TABLE OCCUP*PCTN=" ", GENDER ALL / ROW=FLOAT; RUN; /* Output 11.9 */ PROC TABULATE DATA=TEMP; CLASS OCCUP GENDER; TABLE OCCUP*PCTN=" "*F=PERCENT9.1, GENDER ALL / ROW=FLOAT; RUN; /* Output 11.10 */ PROC FORMAT; PICTURE PCTPIC LOW-HIGH='000.0%'; RUN; PROC TABULATE DATA=TEMP; CLASS OCCUP GENDER; TABLE OCCUP*PCTN=" "*F=PCTPIC., GENDER ALL / ROW=FLOAT; RUN; /* Formatting very large numbers*/ DATA TEMPBIG; SET CHPT11; IF OCCUP IN(1,2,3,4); INCOME=INCOME*1041; RUN; /* Output 11.11 */ PROC TABULATE DATA=TEMPBIG; CLASS SECTOR OCCUP; VAR INCOME; TABLE SECTOR, OCCUP*INCOME=' '*SUM=' ' / BOX='Total Income' RTS=15; RUN; /* Output 11.12 */ PROC TABULATE DATA=TEMPBIG; CLASS SECTOR OCCUP; VAR INCOME; TABLE SECTOR, OCCUP*INCOME=' '*SUM=' '*F=DOLLAR15. / BOX='Total Income' RTS=15; RUN; /* Output 11.13 */ PROC FORMAT; PICTURE MILPIC LOW-HIGH='000,000' (PREFIX='$' MULT=.000001); RUN; PROC TABULATE DATA=TEMPBIG; CLASS SECTOR OCCUP; VAR INCOME; TABLE SECTOR, OCCUP*INCOME=' '*SUM=' '*F=MILPIC12. / BOX='Total Income (in Millions)' RTS=15; RUN; /* Weighting the results*/ DATA TEMP; SET CHPT11A; RUN; /* Output 11.14 */ PROC TABULATE DATA=TEMP F=6.; CLASS YEAR GENDER; VAR SAT; TABLE (YEAR=" " ALL), (GENDER=" " ALL)*SAT=" "*(N*F=6. MEAN*F=6.1) / RTS=20 BOX="Satisfaction Rating" ROW=FLOAT; RUN; /* Output 11.15 */ PROC TABULATE DATA=TEMP; CLASS YEAR GENDER; VAR SAT; WEIGHT THEWT; TABLE (YEAR=" " ALL), (GENDER=" " ALL)*SAT=" "*(SUMWGT="N"*F=6. MEAN*F=6.1) / RTS=20 BOX="Weighted Satisfaction Rating" ROW=FLOAT; RUN; /**********************************************************/ /* Chapter 12: Modifying the Table Grid */ /**********************************************************/ /* Left justifying the table*/ DATA TEMP; SET CHPT12; RUN; /* Output 12.1 */ OPTIONS CENTER; PROC TABULATE DATA=TEMP; CLASS OCCUP GENDER; VAR AGE; TABLE OCCUP=' ', GENDER=' '*AGE=' '*MEAN=' ' / BOX='Mean Age' RTS=15 ROW=FLOAT; TITLE 'THIS IS A CENTERED TITLE AND TABLE'; RUN; /* Output 12.2 */ OPTIONS NOCENTER; PROC TABULATE DATA=TEMP; CLASS OCCUP GENDER; VAR AGE; TABLE OCCUP=' ', GENDER=' '*AGE=' '*MEAN=' ' / BOX='Mean Age' RTS=15 ROW=FLOAT; TITLE 'THIS IS A LEFT-JUSTIFIED TITLE AND TABLE'; RUN; /* Removing the row dividers*/ /* Output 12.3 */ OPTIONS CENTER; TITLE; PROC TABULATE DATA=TEMP NOSEPS; CLASS EDUC RACE FULLTIME; VAR INCOME; TABLE EDUC=" "*(RACE=" " ALL), FULLTIME=" "*INCOME=" "*(N*F=6. MEAN*F=DOLLAR8.) / BOX="Income"; RUN; /* Output 12.4 */ PROC TABULATE DATA=TEMP NOSEPS; CLASS EDUC RACE FULLTIME; VAR INCOME; TABLE EDUC=" "*(RACE=" " ALL="--ALL--"), FULLTIME=" "*INCOME=" "*(N*F=6. MEAN*F=DOLLAR8.) / BOX="Income" INDENT=3 RTS=12; RUN; /* Modifying the FORMCHAR setting*/ /* Output 12.5 */ PROC TABULATE DATA=TEMP FORMCHAR='|----|+|---'; CLASS GENDER EDUC; VAR AGE; TABLE EDUC=' ', GENDER=' '*AGE=' '*MEAN=' ' / BOX='Mean Age' RTS=14; RUN; /* Output 12.6 */ PROC TABULATE DATA=TEMP FORMCHAR='| ||| '; CLASS GENDER EDUC; VAR AGE; TABLE EDUC=' ', GENDER=' '*AGE=' '*MEAN=' ' / BOX='Mean Age' RTS=14; RUN; /* Output 12.7 */ PROC TABULATE DATA=TEMP FORMCHAR=' ----------'; CLASS GENDER EDUC; VAR AGE; TABLE EDUC=' ', GENDER=' '*AGE=' '*MEAN=' ' / BOX='Mean Age' RTS=14; RUN; /* Output 12.8 */ PROC TABULATE DATA=TEMP FORMCHAR='ÇÉÑÖÜáàâäãå'; CLASS GENDER EDUC; VAR AGE; TABLE EDUC=' ', GENDER=' '*AGE=' '*MEAN=' ' / BOX='Mean Age' RTS=14; RUN; /* Fitting more tables on the page: CONDENSE and NOCONTINUED*/ /* Output 12.9 */ OPTIONS LS=90 NOCENTER; PROC TABULATE DATA=TEMP; CLASS GENDER EDUC RACE; TABLE RACE, GENDER=' '*EDUC=' '*N=' '/ BOX='Number of Observations'; RUN; /* Output 12.10 */ PROC TABULATE DATA=TEMP; CLASS GENDER EDUC RACE; TABLE RACE, GENDER=' '*EDUC=' '*N=' '/ BOX='Number of Observations' NOCONTINUED CONDENSE; RUN; /**********************************************************/ /* Chapter 13: Making the Table Fit On the Page */ /**********************************************************/ /* Reformatting class variables*/ OPTIONS LS=90 CENTER; DATA TEMP; SET CHPT13; RUN; /* Output 13.1 */ PROC TABULATE DATA=TEMP; CLASS RACE FULLTIME; VAR NUMKIDS; TABLE FULLTIME, RACE=' '*NUMKIDS=' '*(N MEAN) / BOX='Number of Children'; RUN; /* Output 13.2 */ PROC FORMAT; VALUE NEWRACE 1='White' 2='Black' 3-5='Other'; RUN; PROC TABULATE DATA=TEMP; CLASS RACE FULLTIME; FORMAT RACE NEWRACE.; VAR NUMKIDS; TABLE FULLTIME, RACE=' '*NUMKIDS=' '*(N MEAN) / BOX='Number of Children'; RUN; /* Reducing the space used by row headings*/ /* Output 13.3 */ PROC TABULATE DATA=TEMP; CLASS RACE FULLTIME; FORMAT RACE NEWRACE.; VAR NUMKIDS; TABLE FULLTIME, RACE=' '*NUMKIDS=' '*(N MEAN) / BOX='Number of Children' RTS=10; RUN; /* Output 13.4 */ PROC TABULATE DATA=TEMP; CLASS RACE FULLTIME; FORMAT RACE NEWRACE.; VAR NUMKIDS; TABLE FULLTIME, RACE=' '*NUMKIDS=' '*(N MEAN) / BOX='Number of Children' RTS=12; RUN; /* Reducing the column widths*/ /* Output 13.5 */ PROC TABULATE DATA=TEMP; CLASS RACE FULLTIME; FORMAT RACE NEWRACE.; VAR NUMKIDS; TABLE FULLTIME, RACE=' '*NUMKIDS=' '*(N*F=6. MEAN*F=5.1) / BOX='Number of Children' RTS=12; RUN; /* Output 13.6 */ PROC TABULATE DATA=TEMP; CLASS RACE FULLTIME; FORMAT RACE NEWRACE.; VAR INCOME; TABLE FULLTIME, RACE=' '*INCOME=' '*(N*F=4. MEAN*F=DOLLAR5.) / BOX='Income' RTS=12; RUN; /* Output 13.7 */ PROC TABULATE DATA=TEMP; CLASS RACE FULLTIME; FORMAT RACE NEWRACE.; VAR INCOME; TABLE FULLTIME, RACE=' '*INCOME=' '*(N*F=6. MEAN*F=DOLLAR8.) / BOX='Income' RTS=12; RUN; /* Reformatting the column variables*/ /* Output 13.8 */ PROC TABULATE DATA=TEMP FORMAT=6.1; CLASS RACE OCCUP GENDER; FORMAT RACE NEWRACE.; VAR NUMKIDS; TABLE RACE, GENDER=' '*OCCUP=' '*NUMKIDS=' '*(MEAN) / BOX='Number of Children' RTS=12; RUN; /* Output 13.9 */ PROC FORMAT; VALUE OCC1FT 1="Manag-ement" 2="Profes-sional" 3="Tech-nical" 4="Sales"; VALUE OCC2FT 1="Mgmt." 2="Prof." 3="Tech." 4="Sales"; RUN; PROC TABULATE DATA=TEMP FORMAT=6.1; CLASS RACE OCCUP GENDER; FORMAT RACE NEWRACE. OCCUP OCC1FT.; VAR NUMKIDS; TABLE RACE, GENDER=' '*OCCUP=' '*NUMKIDS=' '*(MEAN) / BOX='Number of Children' RTS=12; RUN; /* Output 13.10 */ PROC TABULATE DATA=TEMP FORMAT=6.1; CLASS RACE OCCUP GENDER; FORMAT RACE NEWRACE. OCCUP OCC2FT.; VAR NUMKIDS; TABLE RACE, GENDER=' '*OCCUP=' '*NUMKIDS=' '*(MEAN) / BOX='Number of Children' RTS=12; RUN; /* Moving the statistics*/ /* Output 13.11 */ PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE FULLTIME, INCOME*OCCUP=' '* (N*F=5. MEAN*F=DOLLAR8. STD*F=DOLLAR8.) / RTS=12; RUN; /* Output 13.12 */ PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE FULLTIME*(N*F=5. MEAN*F=DOLLAR8. STD*F=DOLLAR8.), INCOME*OCCUP=' ' / RTS=12; RUN; /* Output 13.13 */ PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE FULLTIME*(N*F=12. MEAN*F=DOLLAR12. STD*F=DOLLAR12.), INCOME*OCCUP=' ' / RTS=24; RUN; /* Rotating the table*/ /* Output 13.14 */ OPTIONS LS=132 PS=50; PROC TABULATE DATA=TEMP; CLASS RACE OCCUP GENDER; FORMAT RACE NEWRACE.; VAR NUMKIDS; TABLE RACE, GENDER=" "*OCCUP=" "*NUMKIDS=" "*MEAN=" " / BOX="Number of Children" RTS=12; RUN; /* Output 13.15 */ PROC TABULATE DATA=TEMP; CLASS RACE OCCUP GENDER; FORMAT RACE NEWRACE.; VAR NUMKIDS; TABLE GENDER=" "*OCCUP=" "*NUMKIDS=" "*MEAN=" ", RACE / BOX="Number of Children" RTS=26 ROW=FLOAT; RUN; /* Removing a heading by putting it in the table BOX*/ DATA TEMP; SET CHPT13; YEAR=YEAR+2; IF YEAR IN(1987,1992) THEN YEAR=1995; ELSE IF YEAR=1988 THEN YEAR=1996; ELSE IF YEAR=1990 THEN YEAR=1997; RUN; /* Output 13.16 */ OPTIONS PS=47; PROC TABULATE DATA=TEMP; CLASS YEAR GENDER OCCUP; FORMAT RACE NEWRACE.; VAR INCOME; TABLE YEAR*(GENDER ALL), OCCUP=" "*INCOME*(N*F=5. MEAN*F=DOLLAR8.); RUN; /* Output not shown in book */ PROC TABULATE DATA=TEMP; CLASS YEAR GENDER OCCUP; FORMAT RACE NEWRACE.; VAR INCOME; TABLE YEAR*(GENDER ALL), OCCUP=" "*INCOME=" "*(N*F=5. MEAN*F=DOLLAR8.) / BOX="Income"; RUN; /* Removing the row separators*/ DATA TEMP; SET CHPT13A; RUN; /* Output 13.17 */ PROC TABULATE DATA=TEMP NOSEPS; CLASS YEAR AGE; VAR SAT; TABLES YEAR=" ", SAT=" "*AGE="Age Group"*MEAN=" "*F=6.2 / RTS=15 BOX="Mean Satisfaction Score"; RUN; /* Output 13.18 */ DATA TEMP2; SET TEMP; DECNUM=FLOOR(YEAR/10)*10; DECADE=DECNUM||"'s"; RUN; PROC TABULATE DATA=TEMP2 NOSEPS; CLASS YEAR AGE DECADE; VAR SAT; TABLES DECADE=' '*YEAR=' ', SAT=' '*AGE='Age Group'*MEAN=' '*F=6.2 / RTS=15 INDENT=3 BOX='Mean Satisfaction Score'; RUN; /* Changing the font size*/ /* Output 13.19 */ DATA TEMP; SET CHPT13; RUN; PROC TABULATE DATA=TEMP; CLASS OCCUP RACE GENDER; VAR INCOME; TABLE RACE=" "*(GENDER=" " ALL), OCCUP=" "*INCOME=" "*(N*F=8. MEAN*F=DOLLAR10.) / BOX="Income" ROW=FLOAT; RUN; /* Output 13.20 */ /* Note: this example will only work if you license SAS\GRAPH */ FILENAME LISFILE "C:\TEMP\TABOUT.LIS"; PROC PRINTTO PRINT=LISFILE NEW; RUN; PROC TABULATE DATA=TEMP; CLASS OCCUP RACE GENDER; VAR INCOME; TABLE RACE=" "*(GENDER=" " ALL), OCCUP=" "*INCOME=" "*(N*F=8. MEAN*F=DOLLAR10.) / BOX="Income" ROW=FLOAT; RUN; PROC PRINTTO; RUN; GOPTIONS HTEXT=.8 DEVICE=WIN; PROC GPRINT FILEREF=LISFILE; RUN; /* Export table to spreadsheet*/ /* Output 13.21 */ FILENAME LISFILE 'C:\TEMP\TABOUT.LIS'; PROC PRINTTO PRINT=LISFILE NEW; RUN; OPTIONS PS=250 LS=250 NOCENTER; PROC TABULATE DATA=TEMP NOSEPS FORMCHAR=', '; CLASS OCCUP RACE GENDER; VAR INCOME; TABLE RACE=' '*(GENDER=' ' ALL), OCCUP=' '*INCOME=' '*MEAN=' '*F=14. / BOX='Mean Income' ROW=FLOAT RTS=30; RUN; PROC PRINTTO; RUN; /* Splitting up the table*/ /* Output 13.23 */ OPTIONS LS=90; PROC TABULATE DATA=TEMP; CLASS OCCUP RACE GENDER FULLTIME; FORMAT RACE NEWRACE.; VAR INCOME; TABLE RACE=" "*(GENDER=" " ALL), FULLTIME=" "*OCCUP=" "*INCOME=" "*(N*F=4. MEAN*F=DOLLAR8.) / BOX="Income" RTS=21 ROW=FLOAT; RUN; /* Output 13.24 */ PROC TABULATE DATA=TEMP; CLASS OCCUP RACE GENDER FULLTIME; FORMAT RACE NEWRACE.; VAR INCOME; TABLE FULLTIME=" ", RACE=" "*(GENDER=" " ALL), OCCUP=" "*INCOME=" "*(N*F=4. MEAN*F=DOLLAR8.) / BOX="Income" RTS=21 ROW=FLOAT; RUN; /**********************************************************/ /* Chapter 14: Using Macros to Generate Tables */ /**********************************************************/ /* Repeating a table for a series of class variables*/ OPTIONS MPRINT SYMBOLGEN; DATA TEMP; SET CHPT14; RUN; /* Output 14.1 */ PROC TABULATE DATA=TEMP; CLASS SECTOR FULLTIME GENDER; VAR NUMEMP; TABLE SECTOR, FULLTIME=' '*GENDER=' ' *NUMEMP=' '*MEAN=' '*F=8. / BOX="Mean Number of Employees"; TITLE "Original Table Showing Company Data"; RUN; /* Output 14.2 */ %MACRO TABLEIT(ROWVAR); PROC TABULATE DATA=TEMP; CLASS FULLTIME GENDER &ROWVAR; VAR NUMEMP; TABLE &ROWVAR, FULLTIME=' '*GENDER=' ' *NUMEMP=' '*MEAN=' '*F=8. / BOX="Mean Number of Employees"; TITLE "Macro-Generated Table Showing Company Data"; RUN; %MEND TABLEIT; %TABLEIT(SECTOR); %TABLEIT(UNION); /* Repeating a table for a series of statistics*/ /* Output not shown */ PROC TABULATE DATA=TEMP; CLASS SECTOR FULLTIME GENDER; VAR NUMEMP; TABLE SECTOR, FULLTIME=' '*GENDER=' ' *NUMEMP=' '*MEAN=' '*F=8. / BOX="Mean Number of Employess"; TITLE "Original Table Showing Company Data"; RUN; %MACRO TABLEIT(THESTAT, THELABEL, THEFMT); PROC TABULATE DATA=TEMP; class sector fulltime gender; var numemp; table sector, fulltime=' '*gender=' ' *numemp=' '*(&THESTAT)*F=&THEFMT / box="&THELABEL" RTS=20; title "GENERIC TABLE SHOWING COMPANY DATA"; RUN; %MEND TABLEIT; /* Output 14.3, 14.4, 14.5 */ %MACRO TABLEIT(THESTAT, THELABEL, THEFMT); PROC TABULATE DATA=TEMP; CLASS FULLTIME GENDER SECTOR; VAR NUMEMP; TABLE SECTOR, FULLTIME=' '*GENDER=' ' *NUMEMP=' '*(&THESTAT)*F=&THEFMT / BOX="&THELABEL"; TITLE "Macro-Generated Table Showing Company Data"; RUN; %MEND TABLEIT; %TABLEIT(MEAN, Mean Number of Employees, 8.); %TABLEIT(MEAN STD,Number of Employees (Mean and Std), 8.2); %TABLEIT(PCTN,Percent Employees by Sector, 8.1); /* Repeating a table for various time periods*/ /* Output 14.6 */ PROC TABULATE DATA=TEMP; CLASS UNION FULLTIME; VAR INCOME; TABLE UNION=' ', FULLTIME=' '*INCOME=' '*MEAN=' '; TITLE "Mean Income (All Observations)"; RUN; /* Output 14.7 */ %MACRO TABLEIT(WHERECL,THELABEL); PROC TABULATE DATA=TEMP; WHERE &WHERECL; CLASS UNION FULLTIME; VAR INCOME; TABLE UNION=' ', FULLTIME=' '*INCOME=' '*MEAN=' '; TITLE "Mean Income (&THELABEL)"; RUN; %MEND TABLEIT; %TABLEIT('1JAN97'D<=DATE<='31JAN97'D,January 1997); %TABLEIT(YEAR(DATE)=1997,1997); /* Output 14.8 */ DATA TEMP; SET CHPT14A; RUN; %TABLEIT(GENDER EQ 2, Females); /* Repeating a table for a series of time periods - II*/ /* Output 14.9 */ %LET VAR1=Race; %LET VAR2=Marital; %LET VAR3=Occup; %LET VAR4=Fulltime; %MACRO TABLEIT; %DO Y=1985 %TO 1996; %DO V=1 %TO 4; PROC TABULATE DATA=TEMP; WHERE YEAR=&Y; CLASS &&VAR&V GENDER; VAR INCOME; TABLE &&VAR&V=' ', GENDER=' '*INCOME=' '*MEAN=' '*F=DOLLAR8. / ROW=FLOAT BOX="Mean Income"; TITLE "Table of Mean Income by Gender and &&VAR&V for &Y"; RUN; %END; %END; %MEND TABLEIT; %TABLEIT; /* Creating a generic macro to produce tables*/ /* Output 14.10 */ %MACRO TABLEIT(THEROW,THECOL,THEVAR,THEFMT,THESTAT); PROC TABULATE DATA=TEMP; CLASS &THEROW &THECOL; VAR &THEVAR; TABLE &THEROW=' ', &THECOL=' '*&THEVAR=' '*(&THESTAT)*F=&THEFMT / ROW=FLOAT BOX="&THEVAR"; TITLE "Table of &THEVAR (&THESTAT) by &THEROW and &THECOL"; RUN; %MEND TABLEIT; %TABLEIT(GENDER,RACE,INCOME,8.,N); %TABLEIT(MARITAL,EMPLOYED,AGE,8.1,MEAN STD); %TABLEIT(OCCUP,FULLTIME,HOURLY,DOLLAR8.2,MAX); /**********************************************************/ /* Chapter 15: PROC TABULATE Tricks: How to Cheat to Create Complex Tables */ /**********************************************************/ OPTIONS NOMPRINT NOSYMBOLGEN; /* Matching the table design to predefined specifications*/ DATA TEMP; SET CHPT15; RUN; /* Output 15.1 */ PROC TABULATE DATA=TEMP F=10.; CLASS GENDER EDUC; VAR INCOME; TABLE ALL=' '*N (GENDER=' ' ALL)*INCOME=' '*MEAN=' ', EDUC ALL / ROW=FLOAT BOX='Mean Income'; RUN; /* Output 15.2 */ PROC FORMAT; PICTURE NPIC 0-HIGH='0000' (PREFIX='N='); RUN; PROC TABULATE DATA=TEMP F=10.; CLASS GENDER EDUC; VAR INCOME; TABLE ALL=' '*N=' '*F=NPIC. (GENDER=' ' ALL)*INCOME=' '*MEAN=' ', EDUC ALL / ROW=FLOAT BOX='Mean Income'; RUN; /* Renaming the statistics and variables*/ DATA TEMP; SET CHPT15; IF N(RACE,AGE,INCOME,NUMKIDS,YRSEDUC)=5; RUN; /* Output 15.3 */ PROC TABULATE DATA=TEMP; CLASS GENDER; VAR AGE INCOME NUMKIDS YRSEDUC; TABLE AGE INCOME NUMKIDS YRSEDUC, GENDER*(N*F=8. MEAN*F=8.2) / ROW=FLOAT; RUN; /* Output 15.4 */ PROC TABULATE DATA=TEMP; CLASS GENDER; VAR AGE INCOME NUMKIDS YRSEDUC; TABLE AGE=' '*N*F=8. (AGE INCOME NUMKIDS YRSEDUC)*MEAN*F=8.2, GENDER / ROW=FLOAT; RUN; /* Output 15.5 */ PROC FORMAT; PICTURE PARENFT LOW-HIGH='00000)' (PREFIX='('); RUN; PROC TABULATE DATA=TEMP; CLASS GENDER; VAR AGE INCOME NUMKIDS YRSEDUC; TABLE AGE=' '*N='(N)'*F=PARENFT. (AGE INCOME NUMKIDS YRSEDUC)*MEAN=' '*F=8.2, GENDER='MEAN' / ROW=FLOAT; RUN; /* Calculating Percentages Another Way*/ DATA TEMP; SET CHPT15A; RUN; /* Output 15.6 */ PROC TABULATE DATA=TEMP F=8.; CLASS RACE GENDER; TABLE GENDER=' '*(N PCTN*F=8.1) ALL*N, RACE / ROW=FLOAT; RUN; /* Output 15.7 */ DATA TEMP2; SET TEMP; IF GENDER='Female' THEN FEMALE=1; ELSE IF GENDER='Male' THEN FEMALE=0; RUN; PROC TABULATE DATA=TEMP2 F=8.; CLASS RACE; VAR FEMALE; TABLE FEMALE*(SUM='N' MEAN='PCTN'*F=PERCENT8.1) ALL*N, RACE / ROW=FLOAT; RUN; /* Displaying the results of multiple-response questions*/ DATA TEMPANS; SET CHPT15B; RUN; /* Output 15.8 */ PROC TABULATE DATA=TEMPANS NOSEPS; CLASS ANS1-ANS5; TABLE ANS1 ANS2 ANS3 ANS4 ANS5, ALL='Responses (Pct.)'*PCTN*F=14.1 / RTS=25 BOX='Reason for choosing our store'; FORMAT ANS1-ANS5 YESNOFT.; RUN; /* Output 15.9 */ PROC FORMAT; VALUE RESPFT 1='Prices' 2='Service' 3='Location' 4='Hours' 5='Variety'; RUN; DATA TEMPANS2; SET TEMPANS; ARRAY ANS{5} ANS1-ANS5; IF SUM(ANS1,ANS2,ANS3,ANS4,ANS5)>0; DO A=1 TO 5; IF ANS{A} NE . THEN DO; RESP=A; ANSWER=ANS{A}; OUTPUT; END; END; RUN; PROC SUMMARY DATA=TEMPANS2 NWAY; CLASS RESP; VAR ANSWER; OUTPUT OUT=TEMPANS3 MEAN=; RUN; PROC SORT DATA=TEMPANS3; BY DESCENDING ANSWER; RUN; PROC TABULATE DATA=TEMPANS3 ORDER=DATA; CLASS RESP; VAR ANSWER; TABLE RESP=' ', ANSWER='Percent of respondents'*MEAN=' '*F=PERCENT15.1 / RTS=25 BOX='Reason for choosing our store'; FORMAT RESP RESPFT.; RUN; /* Using a variable for both classification and analysis*/ PROC FORMAT; PICTURE PCTPIC LOW-HIGH='000.0%'; RUN; /* Output 15.12 */ PROC TABULATE DATA=TEMP2; CLASS CUSTTYPE SIZE; VAR SAT; TABLE CUSTTYPE=' '*SIZE=' ', SAT*PCTN=' '*F=PCTPIC. SAT=' '*MEAN*F=8.1; RUN; /* Output 15.13 */ DATA TEMP2; SET TEMP; SATN=SAT; RUN; PROC TABULATE DATA=TEMP2; CLASS SAT CUSTTYPE SIZE; VAR SATN; TABLE CUSTTYPE=' '*SIZE=' ', SAT*PCTN=' '*F=PCTPIC. SATN=' '*MEAN*F=8.1; RUN; /* Creating a one-dimensional table that runs vertically*/ DATA TEMP; SET CHPT15C; RUN; /* Output 15.14 */ OPTIONS LS=90; PROC TABULATE DATA=TEMP; CLASS OCCUP; TABLE OCCUP=' '*N*F=15.; RUN; /* Output 15.15 */ PROC TABULATE DATA=TEMP; CLASS OCCUP; TABLE OCCUP=' '*N=' '*F=8., ALL='N' / ROW=FLOAT; RUN; /* Handling class variables with missing data*/ DATA TEMP; SET CHPT15D; RUN; /* Output 15.16 */ PROC TABULATE DATA=TEMP; CLASS GENDER Q1; TABLE Q1*N=' '*F=8., GENDER ALL / ROW=FLOAT; RUN; /* Output 15.17 */ DATA FIXIT; DO A=1 TO 5; DO S=1 TO 2; Q1=A; GENDER=S; OUTPUT; END; END; RUN; DATA FIXED; SET TEMP (IN=REAL) FIXIT (IN=FAKE); IF REAL THEN KEEPIT="Table with no missing data"; ELSE IF FAKE THEN KEEPIT="FAKE DATA - DO NOT USE"; RUN; PROC TABULATE DATA=FIXED; CLASS KEEPIT GENDER Q1; TABLE KEEPIT=' ', Q1*N=' '*F=8., GENDER ALL / BOX=_PAGE_ PRINTMISS ROW=FLOAT; RUN; /* Creating footnote references in table cells - I*/ DATA TEMP; SET CHPT15; IF OCCUP>11 THEN OCCUP=11; RUN; /* Output 15.18 */ PROC FORMAT; VALUE FOOTFT 1='Managerial' 2='Professional' 3='Technical' 4='Sales' 5='Clerical' 6-8='Services' 9-10='Manufacturing' 11='Farming**'; RUN; FOOTNOTE 'Source: XYZ Company Survey.'; FOOTNOTE2 '* Part-time includes employees working <=30 hrs/wk.'; FOOTNOTE3 '** Does not include seasonal employees.'; PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; FORMAT OCCUP FOOTFT.; TABLE OCCUP=' '*N=' ', FULLTIME='Employment Status*'*F=10. / BOX='Number of Employees' ROW=FLOAT; RUN; /* Output 15.19 */ PROC FORMAT; PICTURE FOOTPIC 0-48,50-HIGH='0000000000' 49='00000000**'; RUN; PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; TABLE OCCUP=' '*N=' ', FULLTIME='Employment Status*'*F=FOOTPIC. / BOX='Number of Employees' ROW=FLOAT; RUN; /* Creating footnote references in table cells - II*/ DATA TEMP; SET CHPT15E; RUN; /* Output 15.20 */ PROC FORMAT; PICTURE LOWNOTE LOW-<20000='*' 20000-HIGH='0000000000'; RUN; FOOTNOTE '* <$20,000'; PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE OCCUP=' '*INCOME=' '*MEAN=' '*F=LOWNOTE., FULLTIME=' ' / BOX='Mean Income' ROW=FLOAT ; RUN; /* Output 15.21 */ PROC FORMAT; PICTURE HIGHNOTE LOW-100000='0000000000' 100001-HIGH='*'; RUN; FOOTNOTE '* >$100,000'; PROC TABULATE DATA=TEMP; CLASS OCCUP FULLTIME; VAR INCOME; TABLE OCCUP=' '*INCOME=' '*MEAN=' '*F=HIGHNOTE., FULLTIME=' ' / BOX='Mean Income' ROW=FLOAT ; RUN; /* Creating footnotes to show additional statistical results*/ DATA TEMP; SET CHPT15F; RUN; /* Output 15.22 */ FOOTNOTE '* P-VALUE for test if mean is signif. different from 0'; PROC TABULATE DATA=TEMP; CLASS RACE; VAR CHANGEWT; TABLE RACE=' ', CHANGEWT*(MEAN PRT='P-Value*')*F=8.4; RUN; /* Output 15.23 */ PROC TABULATE DATA=TEMP; CLASS GENDER FULLTIME; TABLES GENDER=' ', FULLTIME=' '*N=' '*F=12.; RUN; /* Output 15.24 */ PROC FREQ DATA=TEMP NOPRINT; OUTPUT OUT=CHI PCHI; TABLES GENDER*FULLTIME / CHISQ; RUN; PROC PRINT; RUN; /* Output 15.25 */ DATA _NULL_; SET CHI; CALL SYMPUT('CHI',PUT(P_PCHI,8.4)); RUN; FOOTNOTE "P-value for chi-square test = &CHI"; PROC TABULATE DATA=TEMP; CLASS GENDER FULLTIME; TABLE GENDER=' ', FULLTIME=' '*N=' '*F=12.; RUN; /**********************************************************/ /* Chapter 16: Outputting the Results */ /**********************************************************/ /* Exporting tables to a spreadsheet: creating the file*/ DATA TEMP; SET CHPT16; RUN; /* Output 16.1 */ PROC TABULATE DATA=TEMP; CLASS OCCUP UNION GENDER; VAR EMPYEARS; TABLE UNION=' '*(GENDER=' ' ALL), OCCUP=' '*EMPYEARS=' '*MEAN=' '*F=12.2 / BOX='Average years employment' ROW=FLOAT RTS=32; RUN; /* Output 16.2, Displays 16.1-16.14 */ FILENAME FORXPORT 'C:\TEMP\TABULATE.LIS'; PROC PRINTTO PRINT=FORXPORT; RUN; OPTIONS LS=250 PS=250; PROC TABULATE DATA=TEMP NOSEPS FORMCHAR=', '; CLASS OCCUP UNION GENDER; VAR EMPYEARS; TABLE UNION=' '*(GENDER=' ' ALL), OCCUP=' '*EMPYEARS=' '*MEAN=' '*F=12.2 / BOX='Average years employment' ROW=FLOAT RTS=32; RUN; PROC PRINTTO; RUN; /* Exporting tables to HTML*/ /* Display 16.15 */ %TAB2HTM (CAPTURE=ON, RUNMODE=B); OPTIONS FORMCHAR='82838485868788898A8B8C'X; PROC TABULATE DATA=TEMP; CLASS OCCUP UNION GENDER; VAR EMPYEARS; TABLE UNION=' '*(GENDER=' ' ALL), OCCUP=' '*EMPYEARS=' '*MEAN=' '*F=12.2 / BOX='Average years employment' ROW=FLOAT RTS=32; RUN; %TAB2HTM(CAPTURE=OFF, RUNMODE=B, OPENMODE=REPLACE, HTMLFILE=C:\TEMP\TEST1.HTML, BRTITLE=PROC TABULATE as HTML); /* Adding hyperlinks to HTML output*/ /* Display 16.16 */ %TAB2HTM (CAPTURE=ON, RUNMODE=B); FOOTNOTE 'Source: Census Bureau'; OPTIONS FORMCHAR='82838485868788898A8B8C'X; PROC TABULATE DATA=TEMP; CLASS OCCUP UNION GENDER; VAR EMPYEARS; TABLE UNION=' '*(GENDER=' ' ALL), OCCUP=' '*EMPYEARS=' '*MEAN=' '*F=12.2 / BOX='Average years employment' ROW=FLOAT RTS=32; RUN; %TAB2HTM(CAPTURE=OFF, RUNMODE=B, OPENMODE=REPLACE, ENCODE=N, HTMLFILE=C:\TEMP\TEST2.HTML, BRTITLE=PROC TABULATE as HTML); /**********************************************************/ /* Chapter 17: Troubleshooting Your Table */ /**********************************************************/ OPTIONS FORMCHAR='|----|+|---'; TITLE; FOOTNOTE; DATA TEMP; SET CHPT17; RUN; /* Output 17.1 */ PROC TABULATE DATA=TEMP; CLASS OWNHOME FULLTIME RACE AGE; VAR NUMKIDS; TABLE OWNHOME FULLTIME RACE, AGE*NUMKIDS=" "*MEAN*F=8.2 / BOX="Number of Children" ROW=FLOAT RTS=32; RUN; /* Output 17.2 */ PROC TABULATE DATA=TEMP; CLASS OWNHOME FULLTIME RACE AGE; VAR NUMKIDS; TABLE OWNHOME FULLTIME RACE, AGE*NUMKIDS*MEAN; RUN; /* Output 17.3 */ PROC TABULATE DATA=TEMP; CLASS AGE; VAR NUMKIDS; TABLE AGE*NUMKIDS*MEAN; RUN; /* Output 17.4 */ PROC TABULATE DATA=TEMP; CLASS AGE OWNHOME; VAR NUMKIDS; TABLE OWNHOME, AGE*NUMKIDS*MEAN; RUN; /* Output 17.5 */ DATA TEMP; SET CHPT17A; RUN; PROC TABULATE DATA=TEMP; CLASS OWNHOME FULLTIME RACE AGE; VAR NUMKIDS; TABLE OWNHOME FULLTIME RACE, AGE*NUMKIDS=" "*MEAN*F=8.2 / BOX="Number of Children" ROW=FLOAT RTS=32; RUN; /**********************************************************/ /* Chapter 18: Error Messages and What They Mean */ /**********************************************************/ /* Code for this chapter is not included (since most of */ /* it is designed to create error messages!) */ /**********************************************************/ /**********************************************************/ /* Chapter 19: Incorrect Tables and How to Fix Them */ /**********************************************************/ /* Code for this chapter is not included (since most of */ /* it is designed to create incorrect tables!) */ /**********************************************************/ /***********************************************************************/ /* Chapter 20: Limitations of PROC TABULATE and How to Get Around Them */ /***********************************************************************/ DATA TEMP; SET CHPT20; RUN; /* Quantile statistics (version 6) */ /* Output 20.2 */ PROC SORT DATA=TEMP; BY AGE GENDER; RUN; PROC UNIVARIATE DATA=TEMP NOPRINT; BY AGE GENDER; VAR INCOME; OUTPUT OUT=TEMPMED MEDIAN=MEDINCM; RUN; DATA TEMP2; MERGE TEMP TEMPMED; BY AGE GENDER; RUN; PROC TABULATE DATA=TEMP2; CLASS AGE GENDER; VAR INCOME MEDINCM; TABLE AGE*GENDER=' ', INCOME=' '*(N MEAN STD) MEDINCM=' '*MEAN='MEDIAN' / BOX='Household Income' ROW=FLOAT RTS=20; RUN; /* Advanced statistical tests*/ PROC SORT DATA=TEMP; BY OCCUP; RUN; /* Output 20.3 */ PROC ANOVA DATA=TEMP NOPRINT OUTSTAT=PVALS; BY OCCUP; CLASS GENDER; MODEL INCOME=GENDER; RUN; PROC SORT DATA=PVALS (KEEP=OCCUP PROB _TYPE_); WHERE _TYPE_='ANOVA'; BY OCCUP; RUN; PROC PRINT DATA=PVALS; RUN; /* Output 20.4 */ DATA TEMP2; MERGE TEMP PVALS; BY OCCUP; RUN; PROC TABULATE DATA=TEMP2; CLASS GENDER OCCUP; VAR INCOME PROB; TABLE OCCUP=' ', GENDER=' '*INCOME=' '*MEAN*F=DOLLAR10. ALL=' '*PROB=' '*MEAN='P-value'*F=10.4 / BOX='Income' ROW=FLOAT; RUN; /* Printing record details*/ PROC FORMAT; VALUE MARFT 0='SINGLE' 1='MARRIED' 2='DIV/WID/DEP'; RUN; DATA DETAILS; SET CHPT20A; RUN; /* Output 20.5 */ PROC TABULATE DATA=DETAILS; CLASS FNAME LNAME YEAR; VAR EDUC INCOME NUMKIDS MARITAL; TABLE FNAME=' '*LNAME=' '*YEAR=' ', (INCOME*F=DOLLAR8. NUMKIDS*F=8. MARITAL*F=MARFT.)*MEAN=' '; RUN; /* Output 20.6 */ PROC PRINT DATA=DETAILS NOOBS; BY FNAME LNAME; ID FNAME LNAME; VAR YEAR INCOME NUMKIDS MARITAL; RUN; /* Output 20.7 */ PROC REPORT DATA=DETAILS SPLIT='*' HEADLINE; COLUMN FNAME LNAME YEAR INCOME NUMKIDS MARITAL; DEFINE FNAME / ORDER LEFT "Name"; DEFINE LNAME / ORDER LEFT " "; DEFINE YEAR / ORDER LEFT "Year"; DEFINE INCOME / SUM RIGHT "Income"; DEFINE NUMKIDS / DISPLAY RIGHT "No. of*Children"; DEFINE MARITAL / DISPLAY LEFT "Marital*Status"; BREAK AFTER FNAME / OL SKIP SUMMARIZE SUPPRESS; RUN; /* Formatting text values*/ OPTIONS LS=90; DATA TEMP; SET CHPT20B; RUN; /* Output 20.8 */ PROC TABULATE DATA=TEMP F=DOLLAR8.; CLASS AGE REGION; VAR INCOME; TABLE REGION="Plant Location"*AGE, ALL=" "*N="# Employees"*F=8. INCOME=" "*(MEAN="Mean" STD="Standard Deviation") / BOX="International Pharmaceutical Corp. Salaries"; RUN; /* Output 20.9 */ PROC REPORT DATA=TEMP SPLIT="*" HEADSKIP; COLUMN REGION AGE (INCOME=INCN INCOME=INCMEAN INCOME=INCSTD); DEFINE REGION / GROUP WIDTH=22 LEFT "Plant Location"; DEFINE AGE / GROUP CENTER "Age Group"; DEFINE INCN / N WIDTH=9 CENTER "#*Employees"; DEFINE INCMEAN / MEAN FORMAT=DOLLAR8. CENTER "Mean Income"; DEFINE INCSTD / STD FORMAT=DOLLAR9. WIDTH=9 CENTER "Standard*Deviation"; BREAK AFTER AGE / SKIP SUPPRESS; TITLE "International Pharmaceutical Corp. Salaries"; RUN; /* Complex table designs*/ DATA TEMP; SET CHPT20C; RUN; /* Output 20.10 */ PROC UNIVARIATE DATA=TEMP NOPRINT; BY AGEGRP GENDER; VAR SCORE1 SCORE2 SCORE3; OUTPUT OUT=OUTSTATS N=N1 N2 N3 MEAN=MEAN1 MEAN2 MEAN3 STD=STD1 STD2 STD3 MEDIAN=MEDIAN1 MEDIAN2 MEDIAN3 NORMAL=NORMAL1 NORMAL2 NORMAL3; RUN; DATA _NULL_; SET OUTSTATS; IF _N_=1 THEN DO; PUT 'Table of Univariate Statistics'; PUT '--------------------------------------------------------------'; PUT @1 'Age' @8 'Gender' @16 'Measure' @26 'N' @32 'Mean' @38 'Std Dev' @47 'Median' @55 'Normality Test'; PUT '--------------------------------------------------------------'; PUT ' '; END; FORMAT MEAN1-MEAN3 STD1-STD3 MEDIAN1-MEDIAN3 Z5.2 NORMAL1-NORMAL3 5.2; IF NORMAL1<.95 THEN NTEXT1='Not Normal'; ELSE NTEXT1='Normal'; IF NORMAL2<.95 THEN NTEXT2='Not Normal'; ELSE NTEXT2='Normal'; IF NORMAL3<.95 THEN NTEXT3='Not Normal'; ELSE NTEXT3='Normal'; PUT @1 AGEGRP @8 GENDER @; PUT @16 'Score1' @24 N1 @32 MEAN1 @40 STD1 @48 MEDIAN1 @56 NORMAL1 @64 NTEXT1; PUT @16 'Score2' @24 N2 @32 MEAN2 @40 STD2 @48 MEDIAN2 @56 NORMAL2 @64 NTEXT2; PUT @16 'Score3' @24 N3 @32 MEAN3 @40 STD3 @48 MEDIAN3 @56 NORMAL3 @64 NTEXT3; PUT ' '; RUN; /* Creating an output dataset - I (version 6)*/ DATA TEMP; SET CHPT20; RUN; /* Output 20.11 */ PROC TABULATE DATA=TEMP F=6.2; CLASS SECTOR OCCUP; VAR EMPYEARS; TABLE OCCUP, SECTOR*EMPYEARS*(N*F=6. MEAN STD MIN MAX) / RTS=12; RUN; /* Output 20.12 */ PROC TABULATE DATA=TEMP F=6.2; CLASS SECTOR OCCUP; VAR EMPYEARS; TABLE OCCUP*SECTOR, EMPYEARS*(N*F=6. MEAN STD MIN MAX) / RTS=28; RUN; /* Output 20.13 */ PROC SUMMARY DATA=TEMP NWAY; CLASS SECTOR OCCUP; VAR EMPYEARS; OUTPUT OUT=TABOUT N=N MEAN=MEAN STD=STD MIN=MIN MAX=MAX; RUN; PROC PRINT DATA=TABOUT (DROP=_TYPE_ _FREQ_); RUN; /* Creating an output dataset - II (version 6)*/ FOOTNOTE; TITLE; /* Output 20.14 */ FILENAME LISFILE 'C:\TEMP\TABOUT.LIS'; PROC PRINTTO PRINT=LISFILE NEW; RUN; PROC TABULATE DATA=TEMP F=6.2 NOSEPS FORMCHAR=', '; CLASS SECTOR OCCUP; VAR EMPYEARS; TABLE OCCUP=' ', SECTOR=' '*EMPYEARS=' '* (N=' '*F=6. MEAN=' ' STD=' ' MIN=' ' MAX=' ') / RTS=14; RUN; PROC PRINTTO; RUN; /* Output 20.15 */ DATA TABOUT; FORMAT OCCUP $12.; INFILE LISFILE DLM="," FIRSTOBS=4 OBS=7 TRUNCOVER; INPUT OCCUP $ N1 MEAN1 STD1 MIN1 MAX1 N2 MEAN2 STD2 MIN2 MAX2; RUN; PROC PRINT DATA=TABOUT; RUN; /**********************************************************/ /* Chapter 22: FORMCHAR Settings Reference */ /**********************************************************/ /* These are the sample FORMCHAR settings from the Chapter */ /* try them out with your favorite PROC TABULATE table */ OPTIONS FORMCHAR="ÇÉÑÖÜáàâäãå"; OPTIONS FORMCHAR="82838485868788898A8B8C"X; OPTIONS FORMCHAR="BACDC9CBBBCCCEB9C8CABC"X; OPTIONS FORMCHAR="B3C4DAC2B1C3C5B4C0C1D9"X; /**********************************************************/ /* Chapter 23: Creating Tables Using SAS/ASSIST */ /**********************************************************/ OPTIONS FORMCHAR='|----|+|---'; DATA TEMP; SET CHPT23; RUN; /* This is the SAS\ASSIST generated code for the */ /* first version of the table, shown in Display 23.18 */ /*------------------------------------------------------------------* | Summary: | | This program creates a simple tabular report using the | | data set SAMPLES and displaying across levels of | | analysis variables and statistics and a down level of | | classification variables. | | Generated: 09SEP98 17:53:49 | *------------------------------------------------------------------* | The OPTIONS statement specifies the dimensions of the printed | | output in characters per line and lines per page and whether or | | not the current date and page number are printed. | | The TITLE and FOOTNOTE statements clear any previously defined | | titles or footnotes. | *------------------------------------------------------------------*/ options linesize=132 pagesize=65 nodate nonumber; title; footnote; proc tabulate data=TEMP ; table OCCUP ALL ,(AGE ) * ( 'N' 'MEAN' 'MIN' 'MAX') ; var AGE ; class OCCUP ; run; /* This is the SAS\ASSIST generated code for the */ /* final version of the table, shown in Display 23.23 */ /*------------------------------------------------------------------* | Summary: | | This program creates a simple tabular report using the | | data set SAMPLES and displaying across levels of | | analysis variables and statistics and a down level of | | classification variables. | | Generated: 09SEP98 17:54:46 | *------------------------------------------------------------------* | The OPTIONS statement specifies the dimensions of the printed | | output in characters per line and lines per page and whether or | | not the current date and page number are printed. | | The TITLE and FOOTNOTE statements clear any previously defined | | titles or footnotes. | *------------------------------------------------------------------*/ options linesize=132 pagesize=65 nodate nonumber; title; footnote; proc tabulate data=TEMP ; table OCCUP ALL ,(AGE ) * (N*f=8. MEAN*f=8.2 MIN*f=8. MAX*f=8.) ; var AGE ; class OCCUP ; run; /**********************************************************/ /* Chapter 24: Version 7 Enhancements */ /* THIS CODE WILL ONLY RUN CORRECTLY UNDER VERSION 7 */ /**********************************************************/ /* Base SAS changes: new naming conventions*/ /* Output 24.1 */ PROC TABULATE DATA=TheWordyDataset; CLASS ReallyLongVariable ReallyLongVariableToo; VAR shorty; TABLE ReallyLongVariableToo, shorty*ReallyLongVariable=' '*MEAN=' '*F=18. / RTS=25 ROW=FLOAT; RUN; /* Output 24.2 */ PROC TABULATE DATA=TheWordyDataset; CLASS ReallyLongVariable ReallyLongVariableToo; VAR shorty; TABLE ReallyLongVariable*shorty, ReallyLongVariableToo*MEAN*F=6. / ROW=FLOAT; RUN; /* Output 24.3 */ PROC FORMAT; VALUE shortfmt 1='Widgets/Gadgets' 2='Other Stuff'; RUN; PROC TABULATE DATA=TheWordyDataset; CLASS ReallyLongVariable ReallyLongVariableToo; VAR shorty; FORMAT ReallyLongVariable shortfmt.; TABLE ReallyLongVariable='Long'*shorty='Short', ReallyLongVariableToo='Long Too'*MEAN*F=6. / ROW=FLOAT; RUN; /* Quantile statistics: medians*/ DATA TEMP; SET CHPT24; RUN; /* Output 24.5 */ PROC TABULATE DATA=TEMP; CLASS AGE GENDER; VAR INCOME; TABLE AGE*GENDER=' ', INCOME*(N MEAN MEDIAN); RUN; /* Output 24.6 */ PROC TABULATE DATA=TEMP QMETHOD=HIST; CLASS AGE GENDER; VAR INCOME; TABLE AGE*GENDER=' ', INCOME*(N MEAN MEDIAN); RUN; /* Quantile statistics: other percentiles*/ /* Output 24.7 */ PROC TABULATE DATA=TEMP; CLASS AGE GENDER; VAR INCOME; TABLE INCOME*F=DOLLAR9.* (MIN P1 P5 P10 P25 P50 P75 P90 P95 P99 MAX), AGE*GENDER=' ' / RTS=20; RUN; /* Output 24.8 */ PROC TABULATE DATA=TEMP; CLASS AGE GENDER; VAR INCOME; TABLE INCOME*F=DOLLAR9.* (Q1 MEDIAN Q3 QRANGE), AGE*GENDER=' ' / RTS=20; RUN; /* CLASS statement options: PRELOADFMT*/ /* Output 24.9 */ PROC FORMAT; VALUE GRADEFT 4='A' 3='B' 2='C' 1='D' 0='F'; RUN; PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS GRADE GENDER; FORMAT GRADE GRADEFT.; TABLE GRADE, N='Number of Students'*GENDER=' '*F=8. / RTS=10; RUN; /* Output 24.10 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS GRADE GENDER / PRELOADFMT; FORMAT GRADE GRADEFT.; TABLE GRADE, N='Number of Students'*GENDER=' '*F=8. / RTS=10 PRINTMISS; RUN; /* CLASS statement options: EXCLUSIVE */ /* Output 24.11 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS GRADE GENDER / PRELOADFMT EXCLUSIVE; FORMAT GRADE GRADEFT.; TABLE GRADE, N='Number of Students'*GENDER=' '*F=8. / RTS=10; RUN; /* Output 24.12 */ PROC TABULATE DATA=OTHERDATA ORDER=FORMATTED; CLASS GRADE GENDER; FORMAT GRADE GRADEFT.; TABLE GRADE, N='Number of Students'*GENDER=' '*F=8. / RTS=10; RUN; /* Output 24.13 */ PROC TABULATE DATA=OTHERDATA ORDER=FORMATTED; CLASS GRADE GENDER / PRELOADFMT EXCLUSIVE; FORMAT GRADE GRADEFT.; TABLE GRADE, N='Number of Students'*GENDER=' '*F=8. / RTS=10; RUN; /* CLASS statement options: MISSING*/ DATA TEMP; SET CHPT24A; RUN; /* Output 24.14 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED MISSING; CLASS GRADE RACE GENDER; TABLE GENDER=' '*GRADE, RACE=' '*N=' '*F=8. / BOX='Number of Students' RTS=20; RUN; /* Output 24.15 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS RACE GENDER; CLASS GRADE / MISSING; TABLE GENDER=' '*GRADE, RACE=' '*N=' '*F=8. / BOX='Number of Students' RTS=20; RUN; /* CLASS statement options: ORDER*/ DATA TEMP; SET CHPT24B; RUN; /* Output 24.16 */ PROC TABULATE DATA=TEMP ORDER=FREQ; CLASS GENDER AGE ANS; TABLE AGE*ANS=' ', (GENDER=' ' ALL)*N=' '*F=10. / RTS=20 ROW=FLOAT BOX='Reason for Choice'; RUN; /* Output 24.17 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS GENDER AGE; CLASS ANS / ORDER=FREQ; TABLE AGE*ANS=' ', (GENDER=' ' ALL)*N=' '*F=10. / RTS=20 ROW=FLOAT BOX='Reason for Choice'; RUN; /* CLASS statement options: DESCENDING, ASCENDING*/ /* Output 24.18 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS AGE GENDER; VAR INCOME; TABLE GENDER=' ', AGE*INCOME=' '*MEAN=' ' / BOX='Mean Income' RTS=10; RUN; /* Output 24.19 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS AGE GENDER / DESCENDING; VAR INCOME; TABLE GENDER=' ', AGE*INCOME=' '*MEAN=' ' / BOX='Mean Income' RTS=10; RUN; /* Output 24.20 */ PROC TABULATE DATA=TEMP ORDER=FORMATTED; CLASS AGE; CLASS GENDER / DESCENDING; VAR INCOME; TABLE GENDER=' ', AGE*INCOME=' '*MEAN=' ' / BOX='Mean Income' RTS=10; RUN; /* CLASSDATA option*/ DATA TEMP; SET CHPT24C; RUN; PROC FORMAT; VALUE MARFT 1='Married' 2='Widowed' 3='Divorced/Sep' 4='Never Married'; RUN; /* Output 24.21 */ PROC TABULATE DATA=TEMP; CLASS GENDER RACE MARITAL; TABLE MARITAL, RACE=' '*GENDER=' '*N=' '*F=8. / RTS=20 BOX='Number of Observations'; RUN; /* !!!!! CODE CHECKED TO HERE !!!!! */ /* Output 24.22 */ DATA CLASSES; FORMAT GENDER GENDERFT. RACE RACEFT. MARITAL MARFT.; INPUT GENDER RACE MARITAL; CARDS; 1 1 1 1 1 3 1 2 1 1 2 3 2 1 1 2 1 3 2 2 1 2 2 3 ; RUN; PROC TABULATE DATA=TEMP CLASSDATA=CLASSES EXCLUSIVE; CLASS GENDER RACE MARITAL; TABLE MARITAL, RACE=' '*GENDER=' '*N=' '*F=8. / RTS=20 BOX='Number of Observations'; RUN; /* Other new options*/ /* Output 24.23 */ DATA TEMPWT; SET CHPT24; INCOME2=INCOME; RUN; PROC TABULATE DATA=TEMPWT; CLASS OCCUP GENDER; VAR INCOME; VAR INCOME2 / WEIGHT=THEWT; TABLE (INCOME='Unweighted' INCOME2='Weighted')* OCCUP=' '*MEAN=' '*F=DOLLAR10., GENDER=' ' ALL / RTS=30 BOX='Mean Income' ROW=FLOAT; RUN; /* Output datasets*/ DATA TEMP; SET CHPT24D; RUN; /* Output 24.24 */ PROC TABULATE DATA=TEMP OUT=TABOUT; CLASS GENDER; VAR INCOME; TABLE GENDER=' ' ALL, INCOME*(N*F=8. MEAN*F=DOLLAR8. MEDIAN*F=DOLLAR8.) / RTS=10; RUN; /* Output 24.25 */ PROC PRINT DATA=TABOUT; RUN; /* Output 24.26 */ PROC TABULATE DATA=TEMP OUT=TABOUT ORDER=FORMATTED; CLASS GRADE GENDER; TABLE GENDER=' ', (GRADE ALL)*PCTN*F=PCTPIC. / RTS=20 ROW=FLOAT; RUN; /* Output 24.27 */ PROC PRINT DATA=TABOUT; RUN; /* Output Delivery System*/ DATA TEMP; SET CHPT24; RUN; /* Output 24.28 */ ODS HTML BODY='C:\TEMP\SAMPLE1.HTML'; PROC TABULATE DATA=TEMP; CLASS GENDER OCCUP; VAR INCOME; TABLE GENDER=' ', OCCUP*INCOME=' '*MEAN=' '*F=DOLLAR13. / BOX='Mean Income' RTS=10; RUN; ODS HTML CLOSE; /* Adding ODS styles to your tables - I*/ DATA TEMP; SET CHPT24E; RUN; /* Output 24.29 */ ODS HTML BODY='C:\TEMP\SAMPLE2.HTML'; PROC TABULATE DATA=TEMP F=10.2; CLASS JobClass Gender Division; VAR JobSatisfaction; TABLE Gender=' '*JobClass=' ' ALL='Overall', MEAN='Mean Job Satisfaction Rating'* Division=' '*JobSatisfaction=' ' / BOX='Cuppa Coffee Co.'; RUN; ODS HTML CLOSE; /* Output 24.30 */ ODS HTML BODY='C:\TEMP\SAMPLE2.HTML'; PROC TABULATE DATA=TEMP F=10.2 S={FOREGROUND=BLACK BACKGROUND=WHITE FONT_WEIGHT=BOLD CELLWIDTH=80 JUST=C}; CLASS JobClass Gender; CLASSLEV JobClass Gender / S={FOREGROUND=BLACK BACKGROUND=WHITE}; CLASS Division; CLASSLEV Division / S={FOREGROUND=WHITE BACKGROUND=PURPLE}; VAR JobSatisfaction; TABLE Gender=' '*JobClass=' ' ALL={LABEL='Overall' S={FOREGROUND=WHITE BACKGROUND=PURPLE JUST=R}}, MEAN={LABEL='Mean Job Satisfaction Rating' S={FOREGROUND=WHITE BACKGROUND=PURPLE}}* Division=' '*JobSatisfaction=' ' / BOX={LABEL='Cuppa Coffee Co.' S={FOREGROUND=WHITE BACKGROUND=PURPLE VJUST=T JUST=L}} S={RULES=None CELLSPACING=0 CELLPADDING=10}; RUN; ODS HTML CLOSE; /* Adding ODS styles to your tables - II*/ /* Output 24.31 and 24.32 - NOTE: TO GET THIS EXAMPLE TO WORK, YOU NEED TO DOWNLOAD THE FILES FEMALE.GIF, MALE.GIF, AND LOGO.GIF AND PLACE THEM IN THE C:\TEMP\ DIRECTORY */ DATA TEMP; SET CHPT24F; RUN; ODS HTML BODY='C:\TEMP\SAMPLE3.HTML'; PROC FORMAT; VALUE DIVFLY 1='NY,NJ,MD,CN,MA,RI' 2='VA,NC,SC,FL,GA,AL' 3='IA,NE,KS,OH,IN' 4='WA,OR,CA,ID,NV,UT'; VALUE GENDGIF 1='C:\TEMP\female.gif' 2='C:\TEMP\male.gif'; VALUE WATCHIT 0-<3='RED' 3-<4='YELLOW' 4-high='DARKGREEN'; RUN; PROC TABULATE DATA=TEMP F=10.2 S={FOREGROUND=WATCHIT. BACKGROUND=LIGHTBLUE FONT_SIZE=4 FONT_WEIGHT=BOLD CELLWIDTH=80 JUST=C}; CLASS JobClass Gender Division; CLASSLEV JobClass / S={FOREGROUND=WHITE BACKGROUND=BLUE}; CLASSLEV Gender / S={FOREGROUND=WHITE BACKGROUND=BLUE VJUST=T POSTIMAGE=GENDGIF. CELLWIDTH=80}; CLASSLEV Division / S={FOREGROUND=WHITE BACKGROUND=DARKBLUE FLYOVER=DIVFLY.}; VAR JobSatisfaction; TABLE Gender=' '*JobClass=' ' ALL={LABEL='Overall' S={FOREGROUND=WHITE BACKGROUND=BLUE JUST=R}}, Mean={LABEL='Mean Job Satisfaction Rating' S={FOREGROUND=WHITE BACKGROUND=DARKBLUE}}* Division=' '*JobSatisfaction=' ' / BOX={LABEL='Cuppa Coffee Co.' S={FOREGROUND=WHITE BACKGROUND=DARKBLUE JUST=L VJUST=T PREIMAGE='C:\TEMP\LOGO.GIF' CELLWIDTH=144}} S={RULES=None CELLSPACING=0 CELLPADDING=10}; RUN; ODS HTML CLOSE; /* ODS style templates for tables */ DATA TEMP; SET CHPT24G; RUN; /* Output 24.33 */ PROC TEMPLATE; DEFINE STYLE STYLES.MYSTYLE; PARENT=STYLES.DEFAULT; STYLE COLORS / "HEADERS"=CX663300 "CELLS"=CXCC9966 "TEXTBLK"=CX000000 "TEXTWHT"=CXFFFFFF; STYLE BODY / PREHTML='

Cuppa Coffee Co.

'; STYLE HEADER FROM HEADERSANDFOOTERS / BACKGROUND=COLORS("HEADERS") FOREGROUND=COLORS("TEXTWHT") VJUST=T; STYLE ROWHEADER FROM HEADERSANDFOOTERS / BACKGROUND=COLORS("HEADERS") FOREGROUND=COLORS("TEXTWHT"); STYLE TABLE FROM HEADERSANDFOOTERS / BACKGROUND=COLORS("CELLS") FOREGROUND=COLORS("TEXTBLK") CELLSPACING=0 BORDERWIDTH=0 RULES=NONE; END; RUN; ODS HTML BODY='C:\TEMP\MYTABLE.HTML' STYLE=STYLES.MYSTYLE; PROC TABULATE DATA=TEMP ORDER=DATA; CLASS RESP; VAR ANSWER; TABLE RESP=' ', ANSWER='% of respondents'*MEAN=' '*F=PERCENT14.1 / RTS=25 BOX='Reason for choice'; FORMAT RESP RESPFT.; RUN; ODS HTML CLOSE; /* Output 24.34 */ DATA TEMP; SET CHPT24; RUN; ODS HTML BODY='C:\TEMP\MYTABLE.HTML' STYLE=STYLES.MYSTYLE; PROC TABULATE DATA=TEMP; CLASS GENDER OCCUP; VAR INCOME; TABLE GENDER=' ', OCCUP*INCOME=' '*MEAN=' '*F=DOLLAR15. / BOX='Mean Income' RTS=10; RUN; ODS HTML CLOSE; /* The data listing below is the raw data that should be stored in the */ /* SAMPLES.TXT file. This file is referenced by many of the examples */ /* in this book. */ 48 11461 12 12 . 5 . 1 8 0 . . 94025 0.940250000000000 0.000000000000000 . 1 2 Wholesale Small . 2 Female 2 Wholesale Small 1996 5.7305 1 65 39337 16 16 1 4 1 1 8 1 2 16 83179 0.831790000000000 0.000000150000000 . 2 3 Wholesale Large . 2 Female 3 Retail Large 1988 19.6685 3 25 27300 16 16 1 7 5 1 8 1 2 1000 91660 0.916600000000000 0.000000150000000 . 4 4 Retail Small . 2 Female 5 Retail Small 1988 13.65 0 36 40008 12 12 1 1 3 1 8 1 2 1000 89040 0.890400000000000 0.000000280000000 . 6 7 Retail Small . 1 Male 4 Retail Small 1996 20.004 2 33 21006 13 13 1 1 1 1 8 1 2 1000 87454 0.874540000000000 0.000000000000000 . 7 1 Wholesale Small . 2 Female 1 Wholesale Small 1985 10.503 0 90 10569 8 9 . 4 . 1 8 0 . . 79399 0.793990000000000 0.000000000000000 . 10 3 Retail Large . 2 Female 3 Retail Large 1993 5.2845 3 57 25202 12 12 1 5 5 1 8 1 2 750 87081 0.870810000000000 0.000000150000000 . 11 1 Wholesale Large . 2 Female 3 Wholesale Large 1996 12.601 3 54 40033 12 12 6 1 11 1 8 1 2 10 91676 0.916760000000000 0.000000150000000 . 12 . Large . 1 Male 7 Retail Large 1996 20.0165 0 52 34 12 12 6 1 11 1 8 1 2 10 91705 0.917050000000000 0.000000000000000 . 13 . Large . 2 Female 4 Wholesale Large 1996 0.017 0 26 10033 16 16 1 7 11 1 8 1 2 750 101385 1.013850000000000 0.000000150000000 . 14 . Small . 1 Male 3 Wholesale Small 1988 5.0165 2 70 9096 12 12 . 1 . 1 8 0 . . 80087 0.800870000000000 0.000000150000000 . 15 3 Wholesale Large . 1 Male 7 Retail Large 1996 4.548 3 69 21181 16 16 . 1 . 1 8 0 . . 101828 1.018280000000000 0.000000000000000 . 16 5 Retail Large . 2 Female 3 Wholesale Large 1988 10.5905 3 27 18594 12 12 1 7 8 1 8 1 2 42 96688 0.966880000000000 0.000000150000000 . 17 5 Wholesale Small . 1 Male 4 Wholesale Small 1996 9.297 2 42 32050 13 13 1 5 5 1 8 1 2 1000 65650 0.656500000000000 0.000000150000000 2 18 5 Retail Small . 2 Female 5 Wholesale Small 1985 16.025 3 47 28364 16 16 6 1 2 1 8 1 2 10 63970 0.639700000000000 0.000000150000000 . 21 7 Wholesale Small . 1 Male 4 Wholesale Small 1988 14.182 2 46 7500 16 16 1 1 4 1 8 1 2 10 67908 0.679080000000000 0.000000000000000 1 22 4 Wholesale Small 0 2 Female 1 Wholesale Small 1988 3.75 3 40 10150 13 13 1 1 2 1 8 1 2 16 65650 0.656500000000000 0.000000280000000 1 23 1 Wholesale Small 0 2 Female 2 Wholesale Small 1985 5.075 1 41 58150 13 13 5 1 2 1 6 1 2 10 86054 0.860540000000000 0.000000000000000 . 24 3 Retail Small . 1 Male 6 Wholesale Small 1985 29.075 2 40 100899 16 16 1 1 11 1 8 1 2 1000 68695 0.686950000000000 0.000000280000000 1 27 . Small . 1 Male 6 Wholesale Small 1988 50.4495 2 38 900 16 16 . 1 . 1 8 0 . . 60393 0.603930000000000 0.000000000000000 . 28 5 Retail Small . 2 Female 5 Retail Small 1988 0.45 0 71 14656 12 12 . 1 . 1 8 0 . . 55563 0.555630000000000 0.000000000000000 . 31 7 Retail Large . 1 Male 7 Wholesale Large 1996 7.328 2 69 7262 12 12 . 1 . 1 8 0 . . 55761 0.557610000000000 0.000000000000000 . 32 1 Retail Large . 2 Female 1 Wholesale Large 1996 3.631 3 58 70084 13 13 1 1 1 1 8 1 2 16 60980 0.609800000000000 0.000000280000000 1 33 4 Wholesale Large 0 1 Male 5 Wholesale Large 1985 35.042 0 54 21000 13 13 1 1 2 1 8 1 2 750 55907 0.559070000000000 0.000000000000000 1 34 3 Retail Large 0 2 Female 5 Retail Large 1985 10.5 1 42 80100 18 20 3 5 2 1 8 1 2 300 63715 0.637150000000000 0.000000280000000 1 35 3 Retail Small 0 2 Female 4 Wholesale Small 1992 40.05 3 49 22000 16 16 1 1 5 1 8 1 2 1000 63970 0.639700000000000 0.000000150000000 1 37 4 Wholesale Small . 1 Male 7 Retail Small 1988 11 0 47 12000 13 13 4 1 5 1 8 1 4 750 67908 0.679080000000000 0.000000000000000 1 38 4 Wholesale Small . 2 Female 3 Wholesale Small 1985 6 0 84 6662 16 16 . 4 . 1 8 0 . . 54470 0.544700000000000 0.000000000000000 . 41 2 Retail Large . 2 Female 3 Retail Large 1988 3.331 0 81 18353 12 12 . 1 . 1 8 0 . . 54527 0.545270000000000 0.000000150000000 . 42 4 Wholesale Large . 1 Male 3 Retail Large 1996 9.1765 1 76 9291 12 12 . 1 . 1 8 0 . . 54470 0.544700000000000 0.000000000000000 . 43 2 Retail Large . 2 Female 4 Retail Large 1996 4.6455 2 81 4326 12 12 . 1 . 1 8 0 . . 104881 1.048810000000000 0.000000000000000 . 44 4 Retail Large . 1 Male 5 Retail Large 1996 2.163 1 78 9495 12 12 . 1 . 1 8 0 . . 110342 1.103420000000000 0.000000000000000 . 45 4 Wholesale Large . 2 Female 2 Retail Large 1996 4.7475 3 49 37000 17 18 1 5 1 1 8 1 2 300 106797 1.067970000000000 0.000000150000000 . 46 4 Retail Small . 2 Female 1 Wholesale Small 1990 18.5 3 26 11424 12 12 1 6 8 1 8 1 2 10 131835 1.318350000000000 0.000000150000000 . 48 5 Wholesale Small . 2 Female 1 Wholesale Small 1996 5.712 3 82 19001 12 12 . 7 . 1 8 0 . . 108067 1.080670000000000 0.000000150000000 . 50 7 Wholesale Large . 1 Male 5 Retail Large 1996 9.5005 0 46 31870 16 16 1 1 4 1 8 1 2 1000 112101 1.121010000000000 0.000000150000000 . 51 6 Wholesale Small . 1 Male 5 Retail Small 1988 15.935 1 44 320 13 13 . 1 . 1 8 0 . . 121720 1.217200000000000 0.000000000000000 . 52 2 Retail Small . 2 Female 4 Retail Small 1985 0.16 3 39 18016 14 14 1 1 3 1 8 1 2 1000 60393 0.603930000000000 0.000000280000000 1 54 3 Wholesale Small 0 2 Female 1 Wholesale Small 1986 9.008 1 39 67616 12 12 1 1 1 1 8 1 2 10 66827 0.668270000000000 0.000000000000000 1 55 3 Retail Small 0 1 Male 5 Retail Small 1996 33.808 1 90 7466 13 13 . 1 . 1 8 0 . . 99335 0.993350000000000 0.000000000000000 . 56 6 Wholesale Large . 1 Male 3 Wholesale Large 1985 3.733 0 84 0 13 13 . 1 . 1 8 0 . . 105417 1.054170000000000 0.000000000000000 . 57 4 Wholesale Large . 2 Female 1 Retail Large 1985 0 0 33 35450 16 16 2 1 1 1 8 1 2 1000 117492 1.174920000000000 0.000000280000000 . 58 7 Retail Small . 1 Male 7 Retail Small 1988 17.725 0 31 45500 16 16 1 1 1 1 8 1 2 300 108484 1.084840000000000 0.000000000000000 . 59 5 Wholesale Small . 2 Female 4 Retail Small 1988 22.75 3 49 35900 10 11 6 1 13 1 8 1 2 10 127306 1.273060000000000 0.000000280000000 . 61 5 Wholesale Small . 1 Male 3 Wholesale Small 1995 17.95 1 46 26628 15 14 6 1 9 1 8 1 2 10 105263 1.052630000000000 0.000000000000000 . 62 1 Wholesale Small . 2 Female 3 Retail Small 1986 13.314 2 29 35100 13 13 1 1 3 1 8 1 2 16 114134 1.141340000000000 0.000000280000000 . 63 6 Wholesale Small . 1 Male 6 Wholesale Small 1985 17.55 1 34 30105 15 14 1 1 5 1 8 1 2 1000 108484 1.084840000000000 0.000000000000000 . 64 1 Retail Small . 2 Female 4 Wholesale Small 1986 15.0525 1 28 24963 15 14 1 7 3 1 8 1 4 10 114134 1.141340000000000 0.000000150000000 . 67 5 Retail Small . 1 Male 6 Wholesale Small 1986 12.4815 0 28 28426 14 14 1 7 5 1 8 1 4 1000 115263 1.152630000000000 0.000000150000000 . 68 4 Retail Small . 2 Female 3 Retail Small 1986 14.213 3 48 50105 17 18 1 1 4 1 8 1 2 1000 127306 1.273060000000000 0.000000280000000 . 69 5 Retail Small . 1 Male 6 Wholesale Small 1990 25.0525 2 49 43676 17 18 4 1 2 1 8 1 2 1000 105263 1.052630000000000 0.000000000000000 . 70 2 Wholesale Small . 2 Female 4 Retail Small 1990 21.838 0 41 40300 15 14 6 1 9 1 8 1 2 10 111394 1.113940000000000 0.000000280000000 . 71 7 Retail Small . 1 Male 4 Wholesale Small 1986 20.15 2 36 22300 13 13 1 1 2 1 8 1 2 300 110423 1.104230000000000 0.000000000000000 . 72 1 Wholesale Small . 2 Female 5 Retail Small 1985 11.15 2 51 120759 12 12 . 1 . 1 8 0 . 1000 110465 1.104650000000000 0.000000310000000 . 74 7 Wholesale Large . 1 Male 5 Wholesale Large 1996 60.3795 0 46 39509 13 13 1 1 1 1 8 1 2 16 105263 1.052630000000000 0.000000000000000 . 75 2 Retail Small . 2 Female 2 Wholesale Small 1985 19.7545 3 40 1415 13 13 1 1 8 1 8 1 . 16 118132 1.181320000000000 0.000000000000000 . 76 3 Retail Small . 2 Female 2 Wholesale Small 1985 0.7075 3 32 15794 13 13 2 1 5 1 8 1 2 1000 126280 1.262800000000000 0.000000000000000 . 77 3 Wholesale Small . 1 Male 3 Retail Small 1985 7.897 1 46 27999 12 12 1 1 11 1 8 1 2 300 108796 1.087960000000000 0.000000150000000 . 81 . Small . 1 Male 7 Wholesale Small 1996 13.9995 2 40 20845 12 12 1 1 5 1 8 1 2 42 118132 1.181320000000000 0.000000000000000 . 82 3 Wholesale Small . 2 Female 4 Retail Small 1996 10.4225 2 29 43700 16 16 1 7 5 1 8 1 2 1000 90752 0.907520000000000 0.000000280000000 . 84 6 Retail Small . 1 Male 5 Wholesale Small 1988 21.85 2 27 36270 16 16 1 7 1 1 8 1 2 1000 90752 0.907520000000000 0.000000280000000 . 85 7 Wholesale Small . 1 Male 3 Retail Small 1988 18.135 0 27 24000 12 12 1 1 1 1 7 1 2 1000 0 0.000000000000000 0.000000150000000 . 86 3 Wholesale Small . 1 Male 3 Retail Small 1996 12 1 29 7300 16 16 1 1 2 1 8 1 2 300 0 0.000000000000000 0.000000000000000 . 87 3 Retail Small . 2 Female 1 Retail Small 1988 3.65 3 59 100295 12 12 6 1 4 1 8 1 5 10 107336 1.073360000000000 0.000000310000000 . 89 5 Wholesale Large . 1 Male 7 Retail Large 1996 50.1475 2 61 7584 12 12 . 1 . 1 8 0 . . 109274 1.092740000000000 0.000000000000000 . 90 2 Wholesale Large . 2 Female 4 Wholesale Large 1996 3.792 2 82 3117 12 12 . 4 . 1 8 0 . . 101667 1.016670000000000 0.000000000000000 . 91 1 Retail Large . 2 Female 5 Retail Large 1996 1.5585 1 77 4200 7 8 . 1 . 1 8 0 . . 84317 0.843170000000000 0.000000000000000 . 92 3 Retail Large . 1 Male 6 Wholesale Large 1992 2.1 1 71 4021 5 4 . 1 . 1 8 0 . . 86575 0.865750000000000 0.000000000000000 . 93 4 Wholesale Large . 2 Female 2 Retail Large 1988 2.0105 2 42 8465 12 12 . 7 . 1 8 0 . . 85786 0.857860000000000 0.000000000000000 . 94 6 Retail Small . 1 Male 4 Wholesale Small 1996 4.2325 3 72 15873 13 13 . 1 . 1 8 0 . . 87117 0.871170000000000 0.000000000000000 . 95 7 Wholesale Large . 1 Male 7 Wholesale Large 1985 7.9365 2 72 4449 11 11.5 . 1 . 1 8 0 . . 86575 0.865750000000000 0.000000000000000 . 96 2 Wholesale Large . 2 Female 5 Retail Large 1996 2.2245 0 41 30024 16 16 1 1 3 1 8 1 5 1000 86126 0.861260000000000 0.000000280000000 . 97 3 Retail Small . 2 Female 1 Wholesale Small 1988 15.012 1 45 35041 15 14 1 1 2 1 8 1 2 1000 89034 0.890340000000000 0.000000000000000 . 98 6 Retail Small . 1 Male 7 Wholesale Small 1986 17.5205 2 52 8001 12 12 1 1 4 . 8 1 . . 61056 0.610560000000000 0.000000000000000 . 101 . Large . 1 Male 4 Wholesale Large 1996 4.0005 2 42 1 8 9 . 1 . . 8 0 . . 55463 0.554630000000000 0.000000000000000 . 102 . Small . 2 Female 1 Wholesale Small 1993 0.0005 3 40 13600 17 18 1 1 2 1 8 1 2 1000 92675 0.926750000000000 0.000000310000000 . 105 1 Wholesale Small . 2 Female 5 Retail Small 1990 6.8 3 40 101999 17 18 1 1 1 1 8 1 2 42 101700 1.017000000000000 0.000000000000000 . 106 6 Wholesale Small . 1 Male 7 Wholesale Small 1990 50.9995 3 30 51100 18 20 1 1 2 1 8 1 2 42 98789 0.987890000000000 0.000000280000000 . 111 2 Retail Small . 2 Female 5 Retail Small 1992 25.55 1 30 24900 16 16 4 1 2 1 8 1 2 1000 105321 1.053210000000000 0.000000000000000 . 112 3 Wholesale Small . 1 Male 5 Retail Small 1988 12.45 2 63 72581 17 18 6 1 1 1 8 1 2 10 98029 0.980290000000000 0.000000280000000 . 113 5 Retail Large . 1 Male 6 Retail Large 1990 36.2905 0 56 14421 13 13 1 1 8 1 8 1 2 300 99053 0.990530000000000 0.000000000000000 . 114 5 Retail Large . 2 Female 5 Wholesale Large 1985 7.2105 2 68 73361 13 13 . 1 . 1 8 0 . . 89024 0.890240000000000 0.000000150000000 . 115 4 Retail Large . 1 Male 7 Wholesale Large 1985 36.6805 2 63 10963 12 12 1 1 4 1 8 1 2 1000 118666 1.186660000000000 0.000000000000000 . 116 4 Retail Large . 2 Female 1 Wholesale Large 1996 5.4815 3 70 16206 14 14 1 5 8 1 8 1 2 42 86088 0.860880000000000 0.000000000000000 . 117 1 Wholesale Large . 2 Female 5 Retail Large 1986 8.103 1 47 31000 12 12 1 5 11 1 8 1 2 16 99370 0.993700000000000 0.000000150000000 . 118 . Small . 1 Male 6 Retail Small 1996 15.5 0 48 81361 17 18 1 1 1 1 8 1 2 1000 99370 0.993700000000000 0.000000280000000 . 119 3 Retail Small . 1 Male 4 Wholesale Small 1990 40.6805 1 48 26211 16 16 1 1 2 1 8 1 2 300 92343 0.923430000000000 0.000000000000000 . 120 5 Retail Small . 2 Female 1 Wholesale Small 1988 13.1055 1 76 14144 12 12 . 1 . 1 8 0 . . 103226 1.032260000000000 0.000000000000000 . 123 6 Wholesale Large . 1 Male 5 Retail Large 1996 7.072 0 74 6251 12 12 . 1 . 1 8 0 . . 86088 0.860880000000000 0.000000000000000 . 124 2 Wholesale Large . 2 Female 1 Retail Large 1996 3.1255 1 35 28500 12 12 1 1 10 1 8 1 2 750 110912 1.109120000000000 0.000000150000000 . 125 4 Wholesale Small . 1 Male 6 Wholesale Small 1996 14.25 0 34 15000 12 12 1 1 4 1 8 1 2 1000 101790 1.017900000000000 0.000000000000000 . 126 5 Wholesale Small . 2 Female 4 Wholesale Small 1996 7.5 0 63 5024 12 12 . 1 . 1 8 0 . . 115392 1.153920000000000 0.000000150000000 . 129 1 Retail Large . 2 Female 2 Retail Large 1996 2.512 0 63 22361 12 12 1 1 8 1 8 0 . . 94455 0.944550000000000 0.000000000000000 . 130 3 Retail Large . 1 Male 4 Retail Large 1996 11.1805 2 35 38470 16 16 1 1 2 1 8 1 2 300 111237 1.112370000000000 0.000000280000000 1 131 5 Retail Small 0 1 Male 5 Wholesale Small 1988 19.235 1 31 31678 16 16 1 1 2 1 8 1 2 300 115491 1.154910000000000 0.000000000000000 1 132 2 Retail Small 0 2 Female 4 Retail Small 1988 15.839 1 64 16958 13 13 1 4 5 1 8 1 2 300 115392 1.153920000000000 0.000000150000000 1 134 4 Retail Large . 2 Female 4 Wholesale Large 1985 8.479 1 43 49400 13 13 1 5 4 1 8 1 2 16 119972 1.199720000000000 0.000000280000000 1 135 6 Retail Small 0 1 Male 4 Wholesale Small 1985 24.7 2 86 17081 10 11 . 4 . 1 8 0 . . 98181 0.981810000000000 0.000000000000000 . 137 3 Retail Large . 1 Male 4 Retail Large 1995 8.5405 2 29 30650 16 16 6 1 2 1 8 0 . 1000 109107 1.091070000000000 0.000000280000000 . 138 1 Retail Small . 2 Female 2 Retail Small 1988 15.325 0 30 57628 13 13 4 1 9 1 8 1 2 300 126768 1.267680000000000 0.000000000000000 2 139 4 Wholesale Small . 1 Male 3 Retail Small 1985 28.814 1 76 13654 12 12 . 1 . 1 8 0 . . 92115 0.921150000000000 0.000000000000000 . 140 7 Wholesale Large . 1 Male 3 Wholesale Large 1996 6.827 1 81 5206 7 8 . 1 . 1 8 0 . . 84305 0.843050000000000 0.000000000000000 . 141 1 Retail Large . 2 Female 1 Retail Large 1992 2.603 1 72 9858 14 14 . 1 . 1 8 0 . . 82382 0.823820000000000 0.000000000000000 . 142 5 Retail Large . 2 Female 3 Retail Large 1986 4.929 2 72 9443 12 12 . 1 . 1 8 0 . . 94599 0.945990000000000 0.000000000000000 . 143 7 Retail Large . 1 Male 5 Retail Large 1996 4.7215 1 31 26004 16 16 1 1 2 1 8 1 2 300 88353 0.883530000000000 0.000000150000000 . 144 6 Wholesale Small . 1 Male 3 Wholesale Small 1988 13.002 2 28 8004 16 16 1 1 2 1 8 1 2 300 96804 0.968040000000000 0.000000000000000 . 145 4 Retail Small . 2 Female 3 Wholesale Small 1988 4.002 0 42 8003 10 11 1 5 10 1 8 1 . 42 87886 0.878860000000000 0.000000000000000 . 147 5 Wholesale Small . 2 Female 1 Wholesale Small 1995 4.0015 2 29 16555 12 12 1 1 1 1 8 1 2 16 96804 0.968040000000000 0.000000150000000 . 149 4 Wholesale Small . 2 Female 4 Wholesale Small 1996 8.2775 2 31 35055 13 13 1 1 10 1 8 1 2 10 88353 0.883530000000000 0.000000000000000 . 150 4 Wholesale Small . 1 Male 5 Wholesale Small 1985 17.5275 2 73 25990 13 13 . 4 . 1 8 0 . . 79954 0.799540000000000 0.000000150000000 . 153 4 Retail Large . 2 Female 1 Retail Large 1985 12.995 1 32 3600 12 12 . 7 . 1 8 0 . . 84877 0.848770000000000 0.000000000000000 . 154 2 Wholesale Small . 2 Female 1 Wholesale Small 1996 1.8 2 49 20013 13 13 6 5 1 1 8 1 2 10 96881 0.968810000000000 0.000000150000000 . 155 5 Retail Small . 2 Female 1 Wholesale Small 1985 10.0065 2 32 30000 13 13 1 6 1 1 8 1 2 1000 88154 0.881540000000000 0.000000150000000 . 157 3 Retail Small . 1 Male 6 Wholesale Small 1985 15 2 34 8044 12 12 1 5 4 1 8 1 2 42 88154 0.881540000000000 0.000000150000000 . 158 7 Retail Small . 1 Male 7 Retail Small 1996 4.022 1 30 13430 13 13 1 7 4 1 8 1 2 42 88154 0.881540000000000 0.000000150000000 . 159 4 Wholesale Small . 1 Male 5 Retail Small 1985 6.715 2 63 10880 5 4 . 6 . 1 8 0 . . 91032 0.910320000000000 0.000000000000000 . 160 3 Wholesale Large . 1 Male 4 Wholesale Large 1988 5.44 2 25 27000 13 13 1 7 5 1 8 1 2 300 101402 1.014020000000000 0.000000150000000 . 161 7 Wholesale Small . 1 Male 5 Retail Small 1985 13.5 0 27 10000 16 16 1 7 1 1 8 1 2 10 103958 1.039580000000000 0.000000150000000 . 162 6 Wholesale Small . 1 Male 4 Wholesale Small 1988 5 1 36 21565 15 14 1 7 8 1 8 1 2 16 92263 0.922630000000000 0.000000150000000 . 163 5 Retail Small . 1 Male 6 Wholesale Small 1986 10.7825 2 56 38433 12 12 1 1 9 1 8 1 4 1000 80533 0.805330000000000 0.000000280000000 . 164 3 Wholesale Large . 1 Male 7 Wholesale Large 1996 19.2165 2 50 56589 17 18 6 1 2 1 8 1 2 10 69391 0.693910000000000 0.000000000000000 . 165 4 Retail Large . 2 Female 5 Wholesale Large 1990 28.2945 1 45 30150 18 20 1 5 2 1 8 1 2 1000 85967 0.859670000000000 0.000000280000000 . 166 3 Retail Small . 2 Female 5 Retail Small 1992 15.075 2 82 28871 18 20 . 1 . 1 8 0 . . 84317 0.843170000000000 0.000000150000000 . 167 7 Wholesale Large . 1 Male 6 Retail Large 1992 14.4355 0 78 25034 17 18 . 1 . 1 8 0 . . 83272 0.832720000000000 0.000000000000000 . 168 5 Retail Large . 2 Female 5 Wholesale Large 1990 12.517 0 46 18050 12 12 6 1 9 1 8 1 3 10 91738 0.917380000000000 0.000000150000000 . 169 6 Wholesale Small . 1 Male 6 Retail Small 1996 9.025 3 37 15950 13 13 3 1 1 1 8 1 2 1000 91161 0.911610000000000 0.000000000000000 . 170 3 Retail Small . 2 Female 2 Retail Small 1985 7.975 2 38 16911 16 16 1 7 13 1 8 1 2 16 91631 0.916310000000000 0.000000150000000 . 174 6 Retail Small . 1 Male 7 Retail Small 1988 8.4555 3 70 23493 12 12 . 1 . 1 8 0 . . 89763 0.897630000000000 0.000000000000000 . 175 6 Wholesale Large . 1 Male 7 Wholesale Large 1996 11.7465 1 63 3392 5 4 . 1 . 1 8 0 . . 78331 0.783310000000000 0.000000000000000 . 176 5 Wholesale Large . 2 Female 4 Retail Large 1988 1.696 1 30 19000 12 12 1 1 5 1 8 1 2 16 91338 0.913380000000000 0.000000150000000 . 177 5 Retail Small . 1 Male 3 Wholesale Small 1996 9.5 2 33 16000 12 12 1 1 4 3 8 1 2 1000 57147 0.571470000000000 0.000000000000000 . 178 . Small . 2 Female 3 Retail Small 1996 8 1 28 49000 12 12 1 7 4 1 8 1 2 10 110770 1.107700000000000 0.000000280000000 . 179 4 Retail Small . 1 Male 3 Retail Small 1996 24.5 3 60 900 7 8 4 1 12 1 8 1 2 300 89622 0.896220000000000 0.000000150000000 . 182 . Large . 1 Male 4 Wholesale Large 1992 0.45 0 61 24800 12 12 1 1 5 1 8 1 2 1000 92342 0.923420000000000 0.000000000000000 . 183 1 Wholesale Large . 2 Female 3 Retail Large 1996 12.4 2 28 13720 12 12 1 7 8 1 8 1 2 42 110770 1.107700000000000 0.000000150000000 . 184 7 Retail Small . 1 Male 6 Retail Small 1996 6.86 3 45 23500 15 14 1 7 5 1 8 1 2 42 123554 1.235540000000000 0.000000150000000 . 185 6 Wholesale Small . 1 Male 4 Wholesale Small 1986 11.75 2 41 29937 13 13 1 1 12 1 8 1 2 1000 108110 1.081100000000000 0.000000150000000 . 186 . Small . 1 Male 7 Wholesale Small 1985 14.9685 0 39 22537 16 16 4 1 2 1 8 1 2 300 107168 1.071680000000000 0.000000000000000 . 187 4 Retail Small . 2 Female 3 Retail Small 1988 11.2685 3 47 21200 13 13 1 6 3 1 8 1 2 42 102161 1.021610000