BookmarkSubscribeRSS Feed
meighanj
Obsidian | Level 7

I am trying to conditionally drop variables from a data set. 

 

%macro drop_correlated(data_set);
%macro dummy; %mend dummy;

	proc corr data=&data_set. pearson NOPROB nomiss Rank NoProb outp=correlations;                                           
	run;

	data reduced;
		set correlations;
		where _TYPE_ = "CORR";
	run;

	data reduced;
		set reduced;
		drop _TYPE_;
	run;

	data _null_;
		set reduced;
		call symput(cat('VAR_',_N_),compress(trim(left(_NAME_))));
		call symput('NUM_VAR',_N_);
	run;
		
	%local i;
	%do i=1 %to &NUM_VAR.;

		data temp_&i.;
			set reduced;
			where _name_ = "&&VAR_&i.";
			drop _name_;
		run;

		%local j;
		%do j=1 %to &NUM_VAR.;

			data temp_&i.;
				set temp_&i.;
				if (-0.5 <= &&VAR_&j. <= 0.5) then %drop_var(temp_&i, &&VAR_&j.);
			run;
		%end;
	%end;
	%put _ALL_;

%mend drop_correlated;

%macro drop_var(data_in, var);
%macro dummy; %mend dummy;

	data &data_in.;
		set &data_in.;
		drop &var.;
	run;

%mend drop_var;


%drop_correlated(data);

I get the error:

 

ERROR 180-322: Statement is not valid or it is used out of proper order.

 

I think this is coming from the drop_var macro.

4 REPLIES 4
WarrenKuhfeld
Ammonite | Level 13

You are trying to call a data step conditionally from a data step.  You can't do that.

Kurt_Bremser
Super User

What you want to do is nonsense, your code would be equivalent to

data temp;
set temp;
if (-0.5 <= var <= 0.5) then drop var;
run;

Drop is a non-conditional statement. You can't drop a variable for a specific row, only for the whole dataset.

 

meighanj
Obsidian | Level 7

The data set only has one row though.

RW9
Diamond | Level 26 RW9
Diamond | Level 26

Please post example test data in the form of a datastep:

https://communities.sas.com/t5/SAS-Communities-Library/How-to-create-a-data-step-version-of-your-dat...

 

And show what you want out at the end.  i would guess a data _null_ to create the list then a drop would be best, something like (assumes missing is to be dropped):

data _null_;
  length dlist $2000;
  set have;
  array c{*} _character_;
  array n{*} _numeric_;
  do over c;
    if missing(c) then dlist=catx(" ",dlist,c);
  end;
  do over n;
    if missing(n) then dlist=catx(" ",dlist,n);
  end;
  call symputx('dlist',dlist);
run;
data want;
  set want (drop=&dlist.);
run;
  

hackathon24-white-horiz.png

The 2025 SAS Hackathon has begun!

It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.

Latest Updates

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 3050 views
  • 0 likes
  • 4 in conversation