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


   /* This code creates the LAKES data set.                */
data lakes;
   input month $ L1_a $ L1_b /
                 @11 L2_a $ L2_b /
                 @11 L3_a $ L3_b /
                 @11 L4_a $ L4_b  /
                 @11 L5_a $ L5_b  /
                 @11 L6_a $ L6_b;
   cards;
march95   high    .
          high    .86
           .      .45
          medium  .88
          low     .96
           .      .45
april95   high    .
          low     .54
           .      .75
          low     .98
          medium  .94
           .      .67
may95     high    .
           .      .32
           .      .43
          low    1.40
          medium  .75
            .     .68
june95    low     .
          medium  1.5
           .      1.2
          high    1.5
          medium  .86
           .      .62
july95    medium  .
          medium  1.32
           .      1.00
          high    .
          medium  1.30
          .        .70
aug95     medium  .
          low     .87
          .       .
          medium  .43
          low     1.8
          .       .91
sep95     medium  .
          medium  .43
           .      .94
          low     .65
          low     .90
           .      .59
;
options nodate nonumber ls=132;
proc print data=lakes noobs;
   title "LAKES Data Set";
run;


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


    /* This is the code for the DROPVAR macro.                 */
%macro dropvar(dsn,typ);
   %local total ccount ncount exist;
   %let total=0;
   %let ccount=0;
   %let ncount=0;
   %let typ=%upcase(&typ);

   %if &dsn ne %then %do;
      data _null_;
         if 0 then set &dsn;
         stop;
      run;
   %end;
   %if &syserr=0 %then %let exist=YES;
   %else %let exist=NO;

   %if &exist=YES and (&typ=N or &typ=C or &typ=B) %then %do;

     proc contents data=&dsn out=_tmp_(keep=type nobs) noprint;

     data _null_;
         set _tmp_ end=eof;
         if nobs=0 then stop;
         if type=1 then num+1;
         else char+1;
         if eof then do;
            call symput('ncount',trim(left(put(num,8.))));
            call symput('ccount',trim(left(put(char,8.))));
         end;

      proc datasets nolist;
         delete _tmp_;
      quit;

      data _null_;
         set &dsn end=eof;

         %if &ccount ne 0 %then %do;
            array chars(*) _character_;
         %end;
         %if &ncount ne 0 %then %do;
            array   nums(*) _numeric_;
         %end;
         length temp $8;

        %if (&typ=C or &typ=B) and &ccount ne 0 %then %do;
            array charchek(*) $1 _c_1 - _c_&ccount;
            retain _c_1-_c_&ccount;
            do i=1 to dim(chars);
               if chars(i) ne ' ' then charchek(i)='X';
            end;
            if eof then do;
               do i=1 to dim(chars);
                  if charchek(i) ne 'X' then do;
                     c+1;
                     call vname(chars(i),temp);
                     call symput('_v'||trim(left(put(c,8.))),trim(temp));
                  end;
               end;
               call symput('total',trim(left(put(c,8.))));
          end;
         %end;

         %if (&typ=N or &typ=B) and &ncount ne 0 %then %do;

            array   numchek(*) $1 _n_1 - _n_&ncount;
            retain _n_1-_n_&ncount;
            do i=1 to dim(nums);
               if nums(i) ne . then numchek(i)='X';
            end;
            if eof then do;
               do i=1 to dim(nums);
                  if numchek(i) ne 'X' then do;
                     c+1;
                     call vname(nums(i),temp);
                     call symput('_v'||trim(left(put(c,8.))),trim(temp));
                  end;
               end;
               call symput('total',trim(left(put(c,8.))));
            end;
         %end;
         run;

       %if &total ne 0 %then %do;
          data &dsn;
             set &dsn(drop=
             %do i=1 %to &total;
                &&_v&i
             %end;
             );
          run;
       %end;

       %put;
       %put NOTE: Macro DROPVAR removed &total variable(s) from data set.;
       %put;

   %end;

   %else %do;
       %put;
       %put ERROR: Execution of macro DROPVAR terminated due to invalid;
       %put %str(       parameter values.);

       %put;
       %put %str(       Data Set Name  = %upcase(&dsn));
       %put %str(       Variable Type  = &typ);
       %put;
   %end;
%mend dropvar;


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


   /* This code invokes the DROPVAR macro.                 */
%dropvar(lakes,b)


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