• Drop variables from a SAS data set when all its values are missing…

    Posted on May 31, 2012 by in SAS, SAS Tips & Tricks

    Drop variables from a SAS data set when all its values are missing…

    /* Create sample data set */
    
    data missing;
      input n1 n2 n3 n4 n5 n6 n7 n8 c1 $ c2 $ c3 $ c4 $;
    datalines;
    1 . 1 . 1 . 1 4 a . c .
    1 1 . . 2 . . 5 e . g h
    1 . 1 . 3 . . 6 . . k l
    ;
    
    options symbolgen;
    
    /*Create two macro variables, num_qty and char_qty, to hold*/
    /*the number of numeric and character variables, respectively.*/
    /*These will be used to define the number of elements in the ARRAYs*/
    /*in the next DATA step.*/
    data _null_;
      set missing (obs=1);
      array num_vars[*] _NUMERIC_;
      array char_vars[*] _CHARACTER_;
      call symputx('num_qty', dim(num_vars));
      call symputx('char_qty', dim(char_vars));
    run;
    
    data _null_;
      set missing end=finished;
    
      /* Use the reserved word _NUMERIC_ to load all numeric variables  */
      /* into the NUM_VARS array.  Use the reserved word _CHARACTER_ to */
      /* to load all character variables into the CHAR_VARS array.      */
      array num_vars[*] _NUMERIC_;
      array char_vars[*] _CHARACTER_;
    
      /* Create 'flag' arrays for the variables in NUM_VARS and CHAR_VARS. */
      /* Initialize their values to 'missing'.  Values initialized on an   */
      /* array statement are retained.                                     */
      array num_miss [&num_qty] $ (&num_qty * 'missing');
      array char_miss [&char_qty] $ (&char_qty * 'missing');
     
      /* LIST will contain the list of variables to be dropped.  Ensure  */
      /* it's length is sufficient.                                      */
      length list $ 50;
     
      /* Check for non-missing values.  Reassign the corresponding 'flag' */
      /* value accordingly.                                               */
      do i=1 to dim(num_vars);
        if num_vars(i) ne . then num_miss(i)='non-miss';
      end;
      do i=1 to dim(char_vars);
        if char_vars(i) ne '' then char_miss(i)='non-miss';
      end;
    
      /* On the last observation of the data set, if a 'flag' value is still */
      /* 'missing', the variable needs to be dropped.  Concatenate the       */
      /* variable's name onto LIST to build the values of a DROP statement   */
      /* to be executed in another step.                                     */
      if finished then do;
      do i= 1 to dim(num_vars);
        if num_miss(i) = 'missing' then list=trim(list)||' '||trim(vname(num_vars(i)));
      end;
      do i= 1 to dim(char_vars);
        if char_miss(i) = 'missing' then list=trim(list)||' '||trim(vname(char_vars(i)));
      end;
      call symput('mlist',list);
      end;
    run;
    
    /* Use the macro variable MLIST in the DROP statement.  PROC DATASETS can */
    /* be used to drop the variables instead of a DATA step.                  */
                                                                                                                                     
    data notmiss;
      set missing;
      drop &mlist;
    run;
    
    proc print;
    run;
    

    Source http://support.sas.com/kb/24/622.html

    Be Sociable, Share!
      Post Tagged with

    Written by

    View all articles by

    Email : [email protected]

    Leave a Reply