*
;
/*
Date: Thu, 15 Jun 1995 14:42:54 EST
Sender: "SAS(r) Discussion" 
From: Ismail Parsa 
Subject: Re: "Elegant" sol'n to creating dummy vars

The following macro code will do what the user intends to do.  I posted
a less elaborated version of this macro earlier.

Try both "paste=yes" and "paste=no" options and see the results...
Parametres  DSN= SAS date
            VAR= Variable
            PREFIX=
            PASTE=
Test Program:
   data test ;
   input code $ @@;
   datalines ;
   d c c d d e b c b b b e f b a e d a e
   ;
   %Dummy ( dsn = test, var = code, prefix = z_ , paste = Y ) ;
   proc print ; run ;


*-----------------------------*
|        Ismail Parsa         |
|   Epsilon Data Management   |
|     50 Cambridge Street     |
|   Burlington MA 01803 USA   |
|                             |
| E-MAIL: sip@epsilon.com     |
| V-MAIL: (617) 273-0250*6734 |
|    FAX: (617) 272-8604      |
|                             |
|  The Usual Caveat Applies   |
*-----------------------------*
*------------------------------------------------------------------------*/

%macro DUMMY    ( dsn    = ,
                  var    = ,
                  prefix = D_,
                  paste  = YES ) ;

proc summary data = &dsn nway ;
     class &var ;
     output out = __cnts ( keep = &var ) ;

*Ho fico jo per eliminar la variable asociada al primer valor;
data __CNTS;
  set __CNTS;
  if _n_ = 1 then delete;
run;
data _null_ ;
 set __cnts nobs = numvals ;

 if _n_ = 1 then
  call symput ( 'num', trim ( left ( put ( numvals, best. ) ) ) ) ;
  call symput ( 'c' || trim ( left ( put ( _n_,     best. ) ) ),
                       trim ( left ( &var ) ) ) ;
run ;

%if %substr ( %upcase ( %left ( &paste ) ), 1, 1 ) = Y %then
%do ;
      data &dsn  ( drop = j ) ;
       set &dsn ;

      array __d ( &num ) %do k=1 %to &num ;
                           &prefix&&c&k
                         %end ; ;
%end ;

%else
%do ;
      data &dsn  ( drop = j rename = ( %do k=1 %to &num ;
                                         d&k = &prefix.&k
                                       %end ; ) ) ;
      set &dsn ;

      array __d ( &num ) d1-d&num ;
%end ;


do j = 1 to &num ; /* initilaize to 0 */
  __d(j) = 0 ;
end ;

if &var = "&c1" then __d ( 1 ) = 1 ;  /* create dummies */

%do i = 2 %to &num ;
   else if &var="&&c&i" then __d ( &i ) = 1 ;
%end;

run ;

%mend Dummy ;

*
;