Z Hunt
Z Hunt

Reputation: 13

Where is the missing operator in the SAS MIN function?

I'm just starting out in SAS and have run into some troubles. I want to get the number of observations from two data sets and assign those values to existing global macro variables. Then I want to find the smaller of the two. This is my attempt so far:

%GLOBAL nBlue = 0;
%GLOBAL nRed = 0;

%MACRO GetArmySizes(redData=, blueData=);
/* Takes in 2 Army Datasets, and outputs their respective sizes to nBlue and nRed */

    data _Null_;
        set &blueData nobs=j;
        if _N_ =2 then stop;
        No_of_obs=j;
        call symput("nBlue",j);
    run;

    data _Null_;
        set &redData nobs=j;
        if _N_ =2 then stop;
        No_of_obs=j;
        call symput("nRed",j);
    run;
    %put &nBlue;
    %put &nRed;
%MEND;

%put &nBlue; /* outputs 70 here */
%put &nRed; /* outputs 100 here */

%put %EVAL(min(1,5));

%GetArmySizes(redData=redTeam1, blueData=blueTeam); /* outputs 70\n100 here */

%put &nBlue; /* outputs 70 here */
%put &nRed; /* outputs 100 here */

%MACRO PrepareOneVOneArmies(redData=,numRed=,blueData=,numBlue=);
/* Takes in two army data sets and their sizes, and outputs two new army
   data sets with the same number of observations */

    %let smallArmy = %eval(min(&numRed,&numBlue));
    %put &smallArmy;

    %local numOneVOne;
    %let numOneVOne = %eval(&smallArmy-%Eval(&nBlue - &nRed));
    %put &numOneVOne;

    data redOneVOne; set &redData (obs=&numOneVOne);
    run;

    data blueOneVOne; set &blueData (obs=&numOneVOne);
    run;
%MEND;

%PrepareOneVOneArmies(redData=redTeam1,numRed=&nRed,blueData=blueTeam,numBlue=&nBlue); 
/* stops executing when program gets to  %let smallArmy =... */

redTeam1 is a data set with 100 observations, blueTeam has 70 observations.

I now run into the problem where whenever I call the function "Min" I get:

"ERROR: Required operator not found in expression: min(1,5)"

or

"ERROR: Required operator not found in expression: min(100,70)"

What am I missing?

"Min" seems like a simple enough function. Also, if it matters, I am using the University edition of SAS.

Upvotes: 1

Views: 358

Answers (1)

Reeza
Reeza

Reputation: 21264

While using functions in macro language you need to wrap the function in %SYSFUNC(). This helps sas delineate from a word that could be min versus a reference to an actual function.

%put %sysfunc(min(1,5));

Not related to your question, but for obtaining the size of a dataset, reading the full data set is an inefficient method. Consider using the dictionary table (SASHELP.VTABLE) instead.

Upvotes: 1

Related Questions