Join Now

Spørgsmål til logikken i et datastep

by Contributor SanderEhmsen on ‎11-26-2014 08:13 AM (305 Views)

Hej!

Gennem nogle blogs fik jeg løst mit problem, som kan illustreres ved følgende kode:

data have;

input ID  AMT;

cards;

10 150

10 100

25 150

25 150

25 150

30 600

30 300

;

data want;

  set have;

  by id notsorted;

  if first.id then sumbyid=0;

    sumbyid+amt;

run;

Imidlertid forstår jeg ikke hel, hvordan SAS tænker. Jeg er med på skridtet: if first.id then sumbyid=0

Imidlertid forstår jeg ikke helt, hvordan den laver steppet sumbyid+amt.

Jeg har eksperimenteret og kan se, at der er et underforstået else. Så hvis der ikke er tale om first.id, så skal den tage amt + sumbyid.

Så langt er jeg vist med. Men hvordan ved SAS, at den skal tage sumbyid fra rækken ovenover? Før jeg søgte på internettet, forsøgte jeg at skrive noget a la

if first.id then sumbyid=0; else amt+lag(sumbyid);

Men det gik ikke.

Starter SAS fra toppen af datasættet og kører slavisk nedad? Og når den så skal bruge en værdi på en variabel, tager den den, der ligger først i dens hukommelse. Altså den, den sidst har været ved?

Jeg håber, nogen kan oplyse mig.

Vh. Sander

Comments
by SAS Employee GeorgMorsing
on ‎11-26-2014 08:34 AM

Hej Sander.

Rigtig godt spørgsmål. Det der driller dig er det statement der hedder  sumbyid+amt. Vi kalder dette for et implicit Retain statement. Dette statement kan også skrives således, hvorved du måske bedre kan forstå alt det der sker:


data want;

retain sumbyid 0;

  set have;

  by id notsorted;

  if first.id then sumbyid=0;

  sumbyid=sumbyid+amt;

run;

  • Retain fortæller SAS på compile time at værdien i kolonnen sumbyid skal huskes, hvor værdien normalt sættes til missing i toppen af data steppet - inden der læses nye data ind 
  • if first.id then sumbyid=0; nulstiller værdien i variablen sumbyid hvergang der startes på en ny id
  • Og endelig aggregerer du værdien af amt til sumbyid sålænge det er samme id   

Jeg bliver altså nødt til at sige at dette lærer man efter 2 timer inde i vores SAS Programmering 2 kursus.

Georg

by Contributor SanderEhmsen
on ‎11-27-2014 02:38 AM

Ahh! Er det sådan, det hænger sammen. Fedt.

Tak for hjælpen

Jeg fornemmer, at jeg virkelig kunne få meget glæde af at tage et egentlig programmeringskursus. Det jeg kan er selvlært, og det går altså lidt langsommere, når alt skal opdages selv.

Min udfordring er bare, at jeg er ansat som analytiker, og det derfor er min statistiske modeller og forståelse, der er de kompetencer, min chef prioriterer, jeg kaster mig over. Men det er bare svært at lave ordenlige modeller, når data ikke er langt hensigtsmæssigt til rette.

Jeg håber dog at få ham overtalt til at tage mig på sådan et programmeringskursus.