- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
I am trying to use a %do loop in a macro, but it does not appear that I can increment by fractions. I am trying to increment by 0.25, but I get the following errors:
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition
was: 0.5
ERROR: The %BY value of the %DO K loop is invalid.
Here is an example of a macro that works:
%macro agree();
data test;
%do k=1 %to 10 %by 2;
result=&k.;
output;
%end;
run;
%mend agree;
%agree();
Here is an example of a macro that does not work when I change the %by value to a fraction:
%macro agree();
data test;
%do k=1 %to 10 %by 0.25;
result=&k.;
output;
%end;
run;
%mend agree;
%agree();
This is not an example of what I am doing. I am just trying to illustrate that the loop doesn't increment on fraction. Is it possible to use a %do loop while incrementing by a fraction?
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Macro arithmetic is integer only. You could use :
%macro agree();
data test;
%do k=100 %to 1000 %by 25;
result=&k./100;
output;
%end;
run;
%mend agree;
PG
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Macro arithmetic is integer only. You could use :
%macro agree();
data test;
%do k=100 %to 1000 %by 25;
result=&k./100;
output;
%end;
run;
%mend agree;
PG
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Correct
But you can produce the needed K values like this:
%macro agree();
%let f=0.25;
%let inc = %sysfunc(ceil(1/&f));
%do Kinc= &inc to 10*&inc;
%let k=%sysevalf(&f*&kinc);
%put Kinc=&kinc K=&k;
%end;
%mend;
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set
Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets
--------------------------
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
wish there is an system option that one can switch the default %eval that micro processor uses to %sysevalf. Haikuo
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
PG is smart and sharp. Here is another way.
%macro agree; data test; %let k=1; %do %while(%sysevalf(&k le 10)) ; result=&k. ; output; %let k=%sysevalf(&k+ 0.25); %end; run; %mend agree; options mprint; %agree
Ksharp
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
There is nothing in your example to suggest you need macro language.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
My example was simplified just for illustration purposes. I would not normally use a macro if my example was all I was doing. I just needed some general help. But thank you for taking a look at my question!