DO, DON T og DORF SAS -programmering Copyright 2002-2011, SAS Institute Inc., Cary, NC, USA SAS Institute Inc., SAS Campus Drive, Cary, North Carolina 27513. SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. indicates USA registration. Other brand and product names are trademarks of their respective companies. Copyright 2011 SAS Institute Inc. All rights reserved.
Formål At fortælle noget om mine tanker i arbejdet med SAS - programmering En udvikling fra SAS version 79.3 til 9.2 (9.3) At alle i lokalet skal se mindst én ting, de ikke vidste om SAS 2
Mit første indtryk SAS Institute har udviklere siddende med fødderne på skrivebordet, mens de tænker over funktioner, som brugerne kan have brug for og vil blive glade for. Et særegent programmeringssprog, der dækker de nødvendige behov for databehandling. Ekstremt fleksibelt i forhold til andre værktøjer (på en mainframe-computer) 3
En quiz her sent på dagen Et SAS -program som man kunne forestille sig det skrevet af en ikke så god SAS -programmør: Hvor mange errors eller warnings fremkommer af det følgende program? 4
Hvor mange fejl? 0-1 1-3 3-5 5-8 8- mange 5
Find en fejl SAS 9.2 %Let DATASÆT=SIMPELBASE ; data tal; do i=1 to ranuni(0)*100 ; n=ranuni(0)*10000 ; output;end; run; data &datasæt ; nummer =1; call missing(of _ALL_); SET "D:\kursus\data\courses.sas7bdat" ; Navn = "Henrik Dorf" ; rc=proc("summary","tal"," ","N","SUM_N"); COMMENT bruges til at fortælle hvilken status en record har ; COMMENT = "OK " ; put ; window hent_dato rows=10 irow=10 #3 @10 "dato" +5 dato ; if _n_=1 then display hent_dato ; Array NUM (*) _Numeric_ ; tal+1; RUN; title "resultatet af proc summary "; proc print data=sum_n ; run; 6
Mere eller mindre end tre fejl? 7
Hvorfor SAS Personlige grunde Programmering på Mainframe Fjerde generations programmeringssprog Har overlevet konkurrence fra APL, pascal, Java, C,C#, med flere Er skalerbart og HW-uafhængigt Potentielt en database uden DBA er Øget personlig produktivitet Man kan men man skal ikke Man skal men man kan slå det fra 8
Performance Programmets performance Jo hurtigere, jo bedre Programmørens performance Jo hurtigere, jo bedre Mindre arbejdstid mere fritid 9
Særegent for SAS First., Last. Flere outputtabeller Lille hukommelsesforbrug ved datahåndtering Formater Samtidig adgang til flere databaser og flere schemas (Tag den frø!) Alle mulige og umulige muligheder Det umulige klarer vi med det samme miraklerne tager lidt længere tid 10
Flere løsninger på samme problem Find antal missing i alle variabler i en SAS -tabel data stat; set sashelp.class end=eof; if age=. then Missing_age+1; if height=. then Missing_height+1; if weight=. then missing_weight+1; if name=" " then missing_name+1; if sex=" " then missing_sex+1; if eof then put _N_ missing_age= missing_height= missing_weight= missing_sex= missing_name= ; run; 11
Resultat Missing_age=0 Missing_height=0 missing_weight=0 missing_sex=0 missing_name=0 NOTE: There were 19 observations read from the data set SASHELP.CLASS. NOTE: The data set WORK.STAT has 19 observations and 10 variables. NOTE: DATA statement used (Total process time): real time cpu time 0.01 seconds 0.01 seconds 12
Flere løsninger på samme problem Trinvis optimering Find antal missing i alle variabler i en SAS -tabel data stat; set sashelp.class end=eof; if age=. then Missing_age+1; if height=. then Missing_height+1; if weight=. then missing_weight+1; if name=" " then missing_name+1; if sex=" " then missing_sex+1; if eof then put _N_ missing_age= missing_height= missing_weight= missing_sex= missing_name= ; run; 13
data stat; set sashelp.class end=eof; if missing(age) then Missing_age+1; if missing(height) then Missing_height+1; if missing(weight) then missing_weight+1; if missing(name) then missing_name+1; if missing(sex) then missing_sex+1; if eof then put _N_ missing_age= missing_height= missing_weight= missing_sex= missing_name= ; run; 14
Ny tabel: nye variable data stat; set sashelp.heart end=eof; 15
Optæl uden navn data stat; set sashelp.class end=eof; array num (*) _numeric_ ; array chr (*) _character_ ; array _miss_ (2,99) _temporary_ ; do _i_=1 to dim(num); If missing(num(_i_)) then _miss_(1,_i_)+1; end; do _i_=1 to dim(chr); if missing(chr(_i_)) then _miss_(2,_i_)+1; end; 16
Præsenter optælling if eof then do; run; end; put _N_= ; do _I_=1 to dim(num); vname=vname(num(_i_)); put vname "=" _miss_(1,_i_) ; end; do _I_=1 to dim(chr); vname=vname(chr(_i_)); put vname "=" _miss_(2,_i_) ; end; output; 17
118 end; 119 do _I_=1 to dim(chr); 120 vname=vname(chr(_i_)); 121 put vname "=" _miss_(2,_i_) ; 122 end; 123 output; 124 end; 125 run; _N_=19 Age =. Height =. Weight =. Name =. Sex =. NOTE: There were 19 observations read from the data set SASHELP.CLASS. NOTE: The data set WORK.STAT has 1 observations and 7 variables. NOTE: DATA statement used (Total process time): real time 0.03 seconds cpu time 0.01 seconds 18
Formater + Proc Freq: proc format ; value $cmiss " "="Missing" other = "Not missing"; value nmiss.="missing" other = "Not missing"; run; proc freq data=sashelp.heart; table _ALL_ / list missing ; format _character_ $cmiss. _numeric_ nmiss. ; run; 19
Formater + Proc Freq: 20
Små nyheder Den bedste måde at blive opdateret på SAS Help What s new in SAS 9.2 21
Små nyheder Den bedste måde at blive opdateret på SAS Help What s new in SAS 9.2 What's New in SAS 9.2 gives you a quick, convenient overview of new functionality, enhanced features, and new products that you might use in SAS 9.2. This document is a compilation of all the What's New topics for products that ship with a SAS release. 22
Små nyheder Den bedste måde at blive opdateret på Proc print blanklines n ; 23
Små store nyheder 24
SAS 9.1 Hent data SAS SAS-program SASsystemet Actio nj Database 25
SAS 9.1 Send forespørgsel modtag svar SAS SAS-program SASsystemet Actio nj Database 26
Mange små nyheder Nye funktioner: Data test ; if num1 ne. Then return=num1 ; else if num2 ne. And return=. Then return=num2 ; else if num3 ne. And return=. Then return=num3 ; Data test ; Run; array num (*) num1-num5; do i=1 to dim(num) return=num(i); if return ne. Then leave; end; Data test ; Run; array num (*) age height weight; do i=1 to dim(num) return=num(i); if return ne. Then leave; end; Data test ; Run; %takefirst(return,num1-num5); 27
Mange små nyheder Nye funktioner: Data test ; if num1 ne. Then return=num1 ; else if num2 ne. And return=. Then return=num2 ; else if num3 ne. And return=. Then return=num3 ; Data test ; Run; Data test ; array num (*) num1-num5; array num (*) age height weight; do i=1 Data to dim(num) test ; do i=1 to dim(num) return=num(i); return=coalesce(num1,num2.num3); return=num(i); if Run; return ne. Then leave; if return ne. Then leave; end; end; Run; Data test ; Run; %takefirst(return,num1-num5); 28
Ny funktion coalesce (og CoalesceC) Data test ; Array num (*) num1-num10; return=coalesce(num1,num2.num3,num4,.); return=coalesce(of num1-num10); return=coalesce(of num(*)); Run; 29
Større nyheder i nyere tid ODS Implicit SQL Nye udviklingsmiljøer: SAS Data Integration Studio, SAS Enterprise Guide Statistical Graphics 30
Andre små nyheder Funktioner Allperm permuteringer : data _null_ ; F1="Rød " ; F2="Blå " ; F3="Grøn"; do while(i<fact(3)) ; I+1; rc=allperm(i,f1,f2,f3); put F1= F2= f3= ; end; run; F1=Rød F2=Blå F3=Grøn F1=Rød F2=Grøn F3=Blå F1=Grøn F2=Rød F3=Blå F1=Grøn F2=Blå F3=Rød F1=Blå F2=Grøn F3=Rød F1=Blå F2=Rød F3=Grøn NOTE: DATA statement used (Total process time): real time 0.00 seconds cpu time 0.01 seconds 31
Andre små nyheder: Options Mcompilenote=all Mautolocdisplay Mexecnote; 93 %macro test; 94 %put %trim( test ) ; 95 %mend; NOTE: The macro TEST completed compilation without errors. 3 instructions 44 bytes. 96 %test; NOTE: The macro TEST is executing from memory. NOTE: The macro TRIM completed compilation without errors. 13 instructions 336 bytes. MAUTOLOCDISPLAY(TRIM): This macro was compiled from the autocall file C:\Program Files\SAS92\SASFoundation\9.2\core\sasmacro\trim.sas NOTE: The macro TRIM is executing from memory. test 32
Paradigmer Opgør med standardmetoder 33
Sortering Undgå sorteringer!! Teknikker til at undgå sorteringer : SQL JOIN kræver ikke sortering» Men den sorterer internt Opret Index» Så returnerer den data i den rette rækkefølge SAS Scalable Performance Data Server» Implicit sortering!! Men hvorfor ikke sortere selv? Eller rettere: planlæg, så data ligger i orden 34
Hold orden Masterdata præsorteret Sorter Merge 35
Hold orden Worst case: data skal sorteres igen Store sorteringer 36
Hukommelse nok Opret tabel Sorter til ny Samlet tid: 160 sek. 37
Sortering For lidt hukommelse (for meget data) Opret tabel Sorter med utility file Kopiering til ny Samlet tid: 230 sek. 38
Sortering Divice and conquer Opsplit data i mange små tabeller, der sorteres SET By returnerer i korrekt rækkefølge Data Result ; SET DS1 DS2 DS3 DS4 DS5 DS6 ; By Key ; RUN: 39
Sortering Divice and conquer Opsplit data i mange små tabeller, der sorteres SET By returnerer i korrekt rækkefølge Data Result ; SET DS1 DS2 DS3 DS4 DS5 DS6 ; By Key ; RUN: 40
Fremtid De ting, jeg synes er spændende og indbyder til at blive undersøgt nærmere lige nu, er: 41
FCMP Mulighed for at lave brugerdefinerede funktioner Mulighed for at afvikle SAS -kode i SAS -kode 42
FCMP En macro med Proc summary %macro summary; %let ds = %sysfunc(dequote(&ds)); %let class = %sysfunc(dequote(&class)); %let var = %sysfunc(dequote(&var)); %let out = %sysfunc(dequote(&out)); proc summary data=&ds Nway; class &class ; var &var ; output out=&out sum= ; run; %mend; 43
FCMP Definition af en funktion proc fcmp outlib = sasuser.ds.functions; function proc (procedure$,ds$,class$,var$,out$); rc = run_macro('summary', ds, class, var, out); return(0); endsub; run; 44
FCMP Anvendelsen af en funktion options cmplib = (sasuser.ds); data test; run; rc=proc("summary","sashelp.class","sex","age HEIGHT WEIGHT","SUM"); 45
FCMP Nyt paradigme Proc Summary Datastep Proc Summary Datastep 46
SGPLOT Statistical Graphics Procedures 47
Nye SAS/GRAPH -procedurer SG SGPLOT SGSCATTER SGPANEL SGRENDER 48
SGPLOT proc sgplot data=sashelp.class; scatter x=height y=weight / group=sex; run; 49
SGPLOT proc sgplot data=sashelp.class; reg x=height y=weight / CLM CLI; run;; 50
SGPLOT God stil grafisk editor 51
Ting, jeg elsker at hade Open empty table 52
Ting, jeg elsker at hade Open empty table Svar: NO! 53
Ting, jeg elsker at hade Resultat en anden tabel, Luk denne tabel 54
Ting, jeg elsker at hade 55
Små irritationer SUBSTR(string, position<,length>) TRANSLATE(source,to-1,from-1<,...to-n,from-n>) TRANSTRN(source,target,replacement) TRANWRD(source,target,replacement) 56
Spørgsmål? 57
Henrik.Dorf@sdk.sas.com Copyright 2011 SAS Institute Inc. All rights reserved.