Det gode SAS-program #15: Bestem kolonnerækkefølgen i din tabel

Denne anbefaling handler om rækkefølgen af kolonner i din SAS-tabel. Typisk danner du tabeller med datasteppet eller PROC SQL.

Vi anbefaler:

  1. Benyt FORMAT statement i starten af datasteppet til at bestemme kolonnerækkefølge
  2. Benyt SELECT statement i PROC SQL til at vælge kolonner og bestemme rækkefølge

Alternativ 1:

data ny_tabel;
   format /* kolonne-rækkefølge */;
   set gammel_tabel;
run;

Benytter du datasteppet til at oprette en SAS-tabel, og ønsker du at ændre kolonnerækkefølgen, er vores anbefaling, at du benytter et FORMAT statement, som placeres inden tabeller indlæses med SET eller MERGE statement. Read More »

Post a Comment

Det gode SAS-program #14: Rækkefølgen af dine steps

Denne anbefaling handler om den rækkefølge, du skriver dine steps i. Overordnet set er vores anbefaling:

Opbyg din kode efter det logiske jobflow

Lad os først se på et jobflow:

Dette diagram viser klart det logiske jobflow i udførelsen af en opgave. I ovenstående eksempel har vi to datasæt, vi ønsker at sætte sammen og rapportere på. Data er organiseret på en sådan måde, at vi skal bruge PROC TRANSPOSE til at lægge data til rette inden det efterfølgende MERGE og rapportering. Read More »

Post a Comment

Det Gode SAS-program #13: Rækkefølgen i et PROC step

Denne anbefaling handler om den rækkefølge, du skriver dine statements i i et PROC step. Det er oftest ikke afgørende for dit output, men af forståelsesmæssige årsager og for at sikre nem vedligeholdelse er disse anbefalinger vigtige.

De overordnede anbefalinger er:

  1. Lad altid dine BY og WHERE statements stå øverst, da disse er generelle indlæsnings-statements.
  2. Saml de specifikke kolonne-statements, der hører til det pågældende PROC step, så disse står samlet i midten.
  3. Lad FORMAT og LABEL statements stå til sidst, da disse er generelle statements mht., hvordan output skal se ud.
  4. Husk altid at definere data med et DATA=, også selvom det senest brugte datasæt anvendes automatisk, hvis man ikke definerer data.
  5. Tilføj et TITLE og/eller FOOTNOTE statement med en dynamisk makrovariabel ved brug af WHERE statements.

Et PROC step bør altså opbygges således:

Placering i PROC steppet Opgave
BY, WHERE Indlæsning og udvælgelse af data
Specifikke kolonne-statements, der passer til den specifikke procedure
FORMAT, LABEL Tilpasning af udseende af output

Read More »

Post a Comment

Det gode SAS-program #12: Rækkefølgen i datasteppet

Denne anbefaling handler om rækkefølgen af SAS-kode i datasteppet. Som udgangspunkt er rækkefølgen vigtig, da SAS udfører programlinjerne i den orden, du har skrevet dem. Og de udføres én gang for hver række, der behandles i datasteppet.

I anbefaling #11 har vi behandlet de specielle COMPILE-TIME statements, og de mest typiske er anvendt i oversigten nedenfor. Den store blok af kode i midten af datasteppet bør logisk grupperes i følgende 3 blokke og i denne rækkefølge:

  1. Validér data
  2. Ret fejl i data
  3. Nye kolonner

Read More »

Post a Comment

Det gode SAS-program #11: Rækkefølgen i datasteppet, COMPILE-TIME statements

Denne anbefaling handler om rækkefølgen af SAS-kode i datasteppet. Som udgangspunkt er rækkefølgen vigtig, da SAS udfører programlinjerne i den orden, du har skrevet dem. Og de udføres én gang for hver række, der behandles i datasteppet.

Der er dog 12 undtagelser. Vi kalder dem COMPILE-TIME statements, som kun udføres ved kompilering af SAS-programmet. Vi anbefaler, at du placerer dem således:        

  1. LENGTH og ATTRIB kan bruges til at oprette en ny kolonne med type og længde. Dette skal ske, inden den pågældende kolonne benyttes senere i koden. Derfor anbefaler vi, at disse 2 statements placeres i toppen af datasteppet.
  2. BY, WHERE, ARRAY og INFORMAT vil typisk referere til kolonner i en tabel/fil, som skal læses. Placer dem derfor lige umiddelbart efter et statement, som indlæser data (SET, MERGE, INPUT).
  3. DROP, KEEP, RENAME, LABEL, RETAIN og FORMAT har informationer om kolonnerne i den nye tabel, der dannes. Placer dem derfor samlet i bunden af datasteppet.

Oversigt over anbefalet placering af COMPILE-TIME statements 

Start på datasteppet   
________________________________________________________                                                                                         
LENGTH og ATTRIB statements
________________________________________________________
Indlæsning af data               
________________________________________________________                                                                                 
BY, WHERE, INFORMAT og ARRAY statements
________________________________________________________
Mere kode – bearbejdning af data        
________________________________________________________                                                         
DROP, KEEP, RENAME, LABEL, RETAIN og FORMAT statements  
________________________________________________________
Afslutning af datasteppet

Read More »

Post a Comment

Det gode SAS-program #10: Rækkefølgen i dit SAS-program

Denne anbefaling handler om at anvende en standardrækkefølge, når man skriver de forskellige elementer af sin SAS-kode. Dette bør gøres for at sikre ensartethed og overskuelighed samt af vedligeholdelsesårsager.

Mine overordnede anbefalinger er:

1. Placer alle definitioner i starten af dit program:
Options, fil &; biblioteksreferencer, makrovariable. Disse bør komme tidligt i programmet for at
skabe overblik og gøre det let at vedligeholde.

2. Generelle statements som TITLE og FOOTNOTE skal også være øverst.

3. Egne makroer, formater og funktioner bør være gemt permanent og altså ikke indgå i din kode,
hvis disse bruges mere end én gang. Vælger du alligevel at lave midlertidige makroer, formater
eller funktioner, bør disse placeres øverst i koden.

4. Brug %include, hvis indholdet af 1-3 ovenfor fylder for meget.
Se anbefaling #04 om Program Flow.

5. Placer ens elementer sammen, eksempelvis alle dine makrovariable i forlængelse af hinanden.

6. Vær konsekvent – så skaber du ensartethed i din kode.

7. Ryd op efter dig selv forstået på den måde, at man bør nulstille TITLE og FOOTNOTE statements,
deassigne libnames etc. efter brug – efter behov.

En standardrækkefølge kunne se således ud: Read More »

Post a Comment

Dashboard – nu også ude på fiskekutteren

I forbindelse med en opgave hos NaturErhvervstyrelsen så jeg en dashboard-løsning, som gav supervisuelle resultater. Den er lavet med SAS 9.3 og vores Enterprise BI-platform. Når jeg ser sådan et godt stykke arbejde hos en kunde, får jeg lyst til at dele det med andre – måske I kan finde inspiration i deres arbejde.

For et år siden havde NaturErhvervstyrelsen ikke nogen SAS Dashboard-løsninger. Men efter at Michael Christiansen var på kursus hos os, blev han nysgerrig på, hvordan dette kunne bruges hjemme hos NaturErhvervstyrelsen. De udviklede en applikation, bl.a. til brug for rapportering inden for fiskerikontrollen. 

Løsningen bruges dagligt internt hos NaturErhverstyrelsen samt eksternt af de ca. 80 kontrollører, der kommer ude på skibene. Udover anvendelse via det normale netværk, bruges løsningen som en del af kontrollørernes mobile arbejdsplads.

Michael fortæller, at det har været en meget hurtig proces at komme fra idé til udvikling af de rapport-/dashboard-sider, der bruges i løsningen. Datagrundlaget er blevet udviklet parallelt med dashboard-delen og har medvirket til, at fremdriften på dashboardet er gået overraskende hurtigt. Der udvikles stadig løbende på løsningen, og der er efterhånden lavet mange forskellige rapporter og links mellem rapporterne, der giver en rigtig god brugeroplevelse.

Read More »

Post a Comment

Missede du Klog på SAS-seminaret?

Over 150 SAS-brugere valgte i går og i dag at bruge formiddagen på at blive kloge(re) på SAS. Seminarerne er efterhånden blevet så populære, at vi måtte rykke ud af vores egne lokaler for at kunne byde alle velkommen.


Til seminaret blev der som vanligt serveret en masse kodetips. Denne gang bl.a. til fuzzy match af data, sletning af filer og brug af den automatiske variabel _ERROR_.

Havde du ikke mulighed for at deltage på seminaret? Bare rolig, du bliver ikke snydt for de gode tips og tricks. Dem kan du nemlig finde her:

Benyt egen SAS-funktion i SAS-format Georg Morsing

Den automatiske variabel ERROR Barbara Olsen

Read More »

Post a Comment

Skriver du tit den samme kode igen og igen?

For nylig skrev Henrik Dorf et blogindlæg, hvor han omtalte en smart funktion, ”add abbreviation macro”, der mere eller mindre automatisk kan sætte en header ind i et nyt SAS-program. Det er drønsmart! Jeg bruger den samme funktion – men faktisk på en lidt anden måde…

Man kan hurtigt blive træt i fingrene, når man skriver SAS-kode… Man kan faktisk gøre livet lidt lettere for sig selv, hvis man har en tendens til at skrive de samme linjer igen og igen. Jeg bruger tit en PROC REG til at køre regressioner med forskellige variable og i forskellige udformninger. Grundstrukturen er lige ud ad landevejen. Syntaksen er forholdsvis nem, men man skal jo alligevel skrive alle keywords etc. hver gang. Hvis man koder i SAS Enterprise Guide, er det blevet markant hurtigere med code completion og mouseover-hjælp etc. (Læs mere her om at skrive sin SAS-kode i Enterprise Guide.) Men jeg har nu valgt at gøre livet endnu nemmere for mig selv…

Jeg skriver tit noget i den her stil:

ods graphics on;
proc reg data=sashelp.class plots(unpack);
model weight=height;
run;
ods graphics off;

Read More »

Post a Comment

Det gode SAS-program #9: Navnestandard for formater

I anbefaling #6 til det gode SAS-program blev det anbefalet, at du benytter en standard for navngivning af elementerne i din SAS-kode. I denne anbefaling koncentrerer vi os om navngivning af formater.

Formater:

  1. Alle formatnavne bør ende på _fmt, eksempelvis age_fmt eller gender_fmt. På denne måde bliver det meget tydeligt, at der er tale om et format.
  2. Formater bør gives et dækkende navn for, hvad formatet indeholder.
  3. Formatnavnet bør være læsevenligt i den forstand, at det tydeligt fremgår, hvad formatet returnerer i et FORMAT statement.
  4. Formatnavnet kan evt. indeholde yderligere underscores, hvis dette fremmer læsevenligheden.
  5. Afkort navnet, hvis du finder det nødvendigt. Undgå forkortelser.
  6. Kald altid dit formatkatalog formats, alternativt formater (hvis du foretrækker det danske navn). Husk at være konsekvent i din navngivning.

Lad os se på et eksempel…

Read More »

Post a Comment