BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
mcs
Obsidian | Level 7 mcs
Obsidian | Level 7

I'd like to use the WHICHN function in a macro.  For instance, in the code below I want to set &test = 3.

data _null_;
array x(5) (2 4 6 8 10);
%let test = %sysfunc(whichn(6, of x(*)));
run;

Instead, I get the following error.

ERROR: Argument 2 to function WHICHN referenced by the %SYSFUNC or %QSYSFUNC macro function is
       not a number.

Is there a way to make it work?

1 ACCEPTED SOLUTION

Accepted Solutions
Astounding
PROC Star

Indirectly, you can.  For example:

data _null_;
array x(5) (2 4 6 8 10);
whichone = whichn(6, of x(*));
call symputx('test', whichone); run;

But directly, no.  Macro language does not try to interpret the values of variables in a SAS data set.  So create a DATA step variable, then use CALL SYMPUTX to transfer that value to a macro variable.

View solution in original post

5 REPLIES 5
Astounding
PROC Star

Indirectly, you can.  For example:

data _null_;
array x(5) (2 4 6 8 10);
whichone = whichn(6, of x(*));
call symputx('test', whichone); run;

But directly, no.  Macro language does not try to interpret the values of variables in a SAS data set.  So create a DATA step variable, then use CALL SYMPUTX to transfer that value to a macro variable.

mcs
Obsidian | Level 7 mcs
Obsidian | Level 7

Thanks for the reply.

 

Unfortunately, I think I oversimplified my example code.  My actual use case has WHICHN inside a macro program.  Something like

%macro which();
	%do i = 2 %to 10 %by 2;
		whichone = whichn(&i, of x(*)); call symputx('test', whichone);
		%put &=i &=test;
	%end;
%mend;

data _null_;
array x(5) (2 4 6 8 10);
%which;
run;

I want test to take on the values 1 to 5 in order.  Instead I get

I=2 TEST=1
I=4 TEST=1
I=6 TEST=1
I=8 TEST=1
I=10 TEST=1

I think I need to find a different workaround.

Tom
Super User Tom
Super User

I cannot make sense of what you want to do.  How does macro code even enter into the problem?

data _null_;
  array x(5) (2 4 6 8 10);
  do i=1 to dim(x);
     test=whichn(i, of x[*]);
     put i= test=;
  end;
run;

Results:

1     data _null_;
2       array x(5) (2 4 6 8 10);
3       do i=1 to dim(x);
4          test=whichn(i, of x[*]);
5          put i= test=;
6       end;
7     run;

i=1 test=0
i=2 test=1
i=3 test=0
i=4 test=2
i=5 test=0

If you wanted to call a macro in the middle of that data step then it would need to be a macro that generated those statements.

%macro which;
  do i=1 to dim(x);
     test=whichn(i, of x[*]);
     put i= test=;
  end;
%mend;

data _null_;
  array x(5) (2 4 6 8 10);
  %which
run;

Results

8     %macro which;
9       do i=1 to dim(x);
10         test=whichn(i, of x[*]);
11         put i= test=;
12      end;
13    %mend;
14
15    options mprint;
16    data _null_;
17      array x(5) (2 4 6 8 10);
18      %which
MPRINT(WHICH):   do i=1 to dim(x);
MPRINT(WHICH):   test=whichn(i, of x[*]);
MPRINT(WHICH):   put i= test=;
MPRINT(WHICH):   end;
19    run;

i=1 test=0
i=2 test=1
i=3 test=0
i=4 test=2
i=5 test=0
CarmineVerrell
SAS Employee

 

Hello,

You unfortunately, can't create Arrays in Macros. That being said your example and question is a little confusing.  You can create  macro variables within a dataset using call symputx routine.

 

Here is an alternative....

 

 

 

data _null_;
array x(5) (2 4 6 8 10);
call symputx("response",whichn(6, of x(*)));
run;

%put &=response;

Tom
Super User Tom
Super User

Just insert the commas between the list of values.

%let test = %sysfunc(whichn(6,2,4,6,8,10));

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

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
  • 5 replies
  • 1074 views
  • 3 likes
  • 4 in conversation