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.

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
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
  • 2700 views
  • 3 likes
  • 5 in conversation