Hej med jer.
Herunder er mine kode snippets fra min præsentation på SAS FANS fredag den 5. Marts 2021 om hash objektet i SAS.
Jeg har beskrevet koden overfladisk nedenfor, men kommentér gerne med spørgsmål eller kommentarer, så uddyber jeg gerne 🙂
Simpelt Hash Objekt Lookup
data En;
input ID;
datalines;
9
1
10
3
2
4
5
8
6
7
;
data To;
input ID num char $;
datalines;
8 80 Firs
2 20 Tyve
4 40 Fyrre
10 100 Hundrede
6 60 Tres
;
data Tre;
if _N_ = 1 then do;
declare hash h(dataset : "To", hashexp : 20); /* Deklarér hash object h med ID som key og num og char som data variable */
h.definekey("ID");
h.definedata("num", "char");
h.definedone();
end;
set En; /* Læs data set En sekventielt */
if 0 then set to; /* Parameter type matching. Sikrer at num og char er i PDV */
call missing(num, char); /* Sæt num og char missing som udgangspunkt */
rc = h.find(); /* Brug Find() Metoden til at slå num og char op på aktuel værdi af ID */
run;
At Fjerne Duplicates med Hash Objektet
data want;
if _N_ = 1 then do; /* Deklarér hash object h med age som key variabel */
dcl hash h();
h.definekey('age');
h.definedone();
end;
set sashelp.class; /* Læs sashelp.class sekventielt */
if h.add() = 0; /* Hvis vi kan indsætte age i h, har vi ikke mødt denne
age før, så vi outputter. Ellers outputtes ikke */
run;
Akkumuleret Variabel
data want;
if _N_ = 1 then do; /* Deklarér hash object h */
dcl hash h();
h.definekey('age');
h.definedata('c');
h.definedone();
end;
set sashelp.class; /* Læs sashelp.class sekventialt */
if h.find() ne 0 then c = 1; /* Hvis age findes i h, sæt c = 1 */
else c + 1; /* Ellers, læg 1 til c */
h.replace(); /* Uanset hvad replacer vi c i h */
run;
File Splitting - Hash Of Hashes
data _null_;
dcl hash hh(); /* Deklarér hash object hh */
hh.definekey ('age'); /* Sæt age som key variabel */
hh.definedata('h', 'age'); /* Sæt h og age som data variable. Dvs hh peger på hash objectet h */
hh.definedone(); /* Afslut deklaration af hh */
dcl hiter i('hh'); /* Deklarér hash iterator objekt og link dette til hh */
do until (z); /* Brug DoW Loop til at læse sashelp.class sekventielt */
set sashelp.class end = z;
if hh.find() ne 0 then do; /* Hvis vi ikke har mødt akutuel værdi af age før, gå ind i Do Blok */
dcl hash h(dataset : 'sashelp.class(obs=0)', multidata:'Y'); /* Deklarér hash object h og tillad flere entries for samme key */
h.definekey('age'); /* Sæt age som key variabel */
h.definedata(all : 'Y'); /* Sæt alle variable fra sashelp.class som data variable */
h.definedone(); /* Afslut deklaration af h */
hh.add(); /* Tilføj hash object instans til hh */
end; /* Do Blok slut */
h.add(); /* Uanset om vi har mødt akutuel værdi af age før peger vi nu på korrekt hash object h.
Derfor kan vi tilføje aktuel værdi af age til h */
end;
do while(i.next() = 0); /* Brug hash iterator til at iterere over alle entries i hh. Dvs over alle instanser af h */
h.output(dataset:cats('data_', age)); /* Output entries fra det 'aktive' hash object (Dvs det som hh peger på) til et SAS data set */
end;
run;
Vh Peter Clemmensen