Join Now

Tip: Tværsum funktion - Dan din egen funktion med PROC FCMP

by SAS Employee GeorgMorsing on ‎12-12-2014 02:29 AM (258 Views)

På klog-på-SAS seminaret den 11. december spurgte Jens Petersen fra NaturErhvervstyrelsen om ikke der findes en tværsum funktion i SAS. Jens kunne nemlig ikke finde en sådan, og har flere gange manglet en sådan.

Men her er en løsning. Fra SAS 9.1 har man kunnet lave sin egen SAS funktion med PROC FCMP. Og vi er så heldige at min kollega Ole Steen har lavet en tværsumfunktion til os. Jeg vedlægger to SAS programmer til denne artikel. Den ene er tværsum funktionen og den anden et mindre eksempel du kan bruge til at forstå PROC FCMP.

Sådan laver du din egen SAS funktion:

PROC FCMP antal obs i en tabel.jpg

  1. Kald PROC FCMP og definer funktionsnavn - i linje 4 kaldes den NUMS
  2. Bestem antallet af parametre - i linje 4 defineres én parameter
  3. Skriv helt normal DATA Step kode - linje 5-8
  4. Send resultatet af din funktion retur med RETURN statement
  5. Fortæl SAS hvor der skal ledes efter egne SAS funktioner - linje 13

Har du også lavet en smart SAS funktion?

Vil du dele den med os andre?

Georg

Attachment
Attachment
Comments
by SAS Employee HenrikDorf
on ‎12-12-2014 11:11 AM

Hej

Ved at skrive lidt mindre kode og anvende andre funktioner er funktionen her lidt hurtigere at bruge og derfor bedre ved større datamængder.

Rekursivt kald sikrer at den korte tværsum ordnes af funktionen selv.

Desuden kan den nu også regne tværsum på negative tal .

Med venlig hilsen

Henrik Dorf



/*******************************************************/

/* Funktionen returnerer tværsummen af det angivne tal */

/* Argument 2, indikerer om simpel eller reduceret     */

/* tværsum returneres.                                 */

/*                                                     */

/* Eksemelvis: tver = tvaer(123456,'s');                */

/* Returnerer: tver = 21                               */

/*                                                     */

/* Eksemelvis: tver = tvaer(123456,'r');                */

/* Returnerer: tver = 3                                */

/*                                                     */

/* Hvis parameteren ikke er et heltal returneres tvær- */

/* summen af heltallet, og der gives en warning i log */

/*******************************************************/

proc fcmp outlib=work.funktioner.georg;

  function tvaer(value,type $);

  length retur 8 lvalue 8;

  if floor(value) ne value then

  do;

  put 'WARNING:WARNING: The value ' value ' is not an integer';

  end;

  lvalue=floor(abs(value));

  do until (lvalue <= 0) ;

  retur=sum(retur,ifn(lvalue>9,mod(lvalue,10),lvalue));

  lvalue=floor(lvalue/10);

  end;

  if UPCASE(TYPE)="R" and retur>9 then retur=TVAER(retur,"R");

  return(retur);

  endsub;

run;

Options cmplib=work.funktioner;

data test1;

do tal=456,31213,0,1,12345679;

  sum=tvaer(tal,'s');

  sum2=tvaer(tal,'r');

  put tal= sum= sum2= ;

  output;

end;

run;

data test2;

do tal=1 to 100000;

  sum=tvaer(tal,'s');

  sum2=tvaer(tal,'r');

/*  put tal= sum= sum2= ;*/

  output;

  end;

run;

by SAS Employee OleSteen
on ‎12-12-2014 11:27 AM

Hej Henrik.

Fantastisk - jeg var ikke lige kommet på det rekursive kald Smiley Sad, så fedt at du griber bolden Smiley Happy

Det ændrer dog ikke på min fascination af PROC FCMP, den har vi altså manglet altid!

Har iøvrigt planer om at poste et andet eksempel her i løbet af måneden som også anvender FCMP - so watch out, I'll be back :smileyalert:

Mvh.

Ole Steen