BookmarkSubscribeRSS Feed
Ujjawal
Quartz | Level 8

I am trying to calculate the number of numeric values in a macro parameter.

 

The code below works for character strings- 

%let x = A B C;

%let n = %SYSFUNC(COUNTW(&x));

 

The code below does not work for numeric values- 

 

%let x = 10 20 50;

%let n = %SYSFUNC(COUNT(&x));

 

 

I know COUNT does not work like this. Which function i can use to solve it?

6 REPLIES 6
Astounding
PROC Star

For your example, you can still use COUNTW.

 

Do you have more complex situations, such as:

 

%let x = 20 abc 50 A1;

 

If so, what would you like the result to be?

Ujjawal
Quartz | Level 8

%let x = 20 abc 50 A1;

 

 It should return 2 since two values are numeric.

 

Astounding
PROC Star

Counting numeric vs. character separately is much harder.

 

But COUNTW will work with a list of numeric values.  There must be some other problem.  You can always post the code that gives you a blank.

Ksharp
Super User

How about this :

 

 

%macro count_digit(t=);
%local temp count;
%let count=0;
 %do i=1 %to %sysfunc(countw(&t));
  %let temp=%scan(&t,&i);
  %if %datatyp(&temp)=NUMERIC %then %do; 
   %let count=%eval(&count+1); 
  %end;
 %end;
&count 
%mend;



%let x = 20 abc 50 A1;
%let n = %count_digit(t=&x);

%put &n;
FreelanceReinh
Jade | Level 19

Great suggestion from @Ksharp (as always). The %DATATYP autocall macro would even recognize leading plus or minus signs, decimal points or scientific notation (...E-6) as valid parts of numeric values. If this more general type of numeric "words" could occur, however, the sets of delimiters used by both COUNTW and %SCAN should be restricted (e.g. reduced to blanks, as shown below), as otherwise plus and minus signs and decimal points would be regarded as delimiters:

countw(&t,%str( ))
%scan(&t,&i,%str( ))
ballardw
Super User

Probably misunderstanding how COUNT works. Count counts the number of times a substring appears in a string.

Count("xyxzxb 123","x") would return 3 times that X appears in the string.

%let x= 1,2,3;

%let count=%sysfunc(n(x)); would give you count but the list would have to be comma separated which in general is a suboptimal choice with macro variables and fails miserably if any nonnumeric noncomma characters are encountered.

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 2445 views
  • 3 likes
  • 5 in conversation