Sample 24622: Drop variables from a SAS data set when all its values are missing
Use arrays and iterative DO loops to determine whether a variable's values are all missing. Create a macro variable whose value is the list of the variables to be dropped. Use the macro variable in a DROP statement in a subsequent DATA step.
/* 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;
Obs n1 n2 n3 n5 n7 n8 c1 c3 c4
1 1 . 1 1 1 4 a c
2 1 1 . 2 . 5 e g h
3 1 . 1 3 . 6 k l
Use arrays and iterative DO loops to determine whether a variable's values are all missing. Create a macro variable whose value is the list of the variables to be dropped. Use the macro variable in a DROP statement in a subsequent DATA step.
| Type: | Sample |
| Topic: | SAS Reference ==> DATA Step Data Management ==> Manipulation and Transformation ==> Array processing
|
| Date Modified: | 2009-08-07 10:27:04 |
| Date Created: | 2004-09-30 14:08:58 |
Operating System and Release Information
| SAS System | Base SAS | All | n/a | n/a |