BookmarkSubscribeRSS Feed
PeterClemmensen
Super User

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

 

 

SAS INNOVATE 2024

Innovate_SAS_Blue.png

Registration is open! SAS is returning to Vegas for an AI and analytics experience like no other! Whether you're an executive, manager, end user or SAS partner, SAS Innovate is designed for everyone on your team. Register for just $495 by 12/31/2023.

If you are interested in speaking, there is still time to submit a session idea. More details are posted on the website. 

Register now!

Discussion stats
  • 0 replies
  • 369 views
  • 2 likes
  • 1 in conversation