SAS MIN功能中缺少运算符的位置在哪里?

时间:2015-11-12 21:00:07

标签: sas min

我刚刚开始使用SAS并遇到了一些麻烦。我想从两个数据集中获取观察数量,并将这些值分配给现有的全局宏变量。然后我想找到两者中较小的一个。这是我到目前为止的尝试:

%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是一个包含100个观测值的数据集,blueTeam有70个观测值。

我现在遇到的问题是每当我调用函数" Min"我明白了:

  

"错误:在表达式中找不到必需的运算符:min(1,5)"

  

"错误:在表达式中找不到必需的运算符:min(100,70)"

我错过了什么?

"最小和#34;看起来像一个简单的功能。此外,如果重要,我正在使用SAS的大学版。

1 个答案:

答案 0 :(得分:1)

在宏语言中使用函数时,需要将函数包装在%SYSFUNC()中。这有助于描述一个单词,该单词可以是min而不是对实际函数的引用。

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

与您的问题无关,但是为了获得数据集的大小,读取完整数据集是一种低效的方法。请考虑使用字典表(SASHELP.VTABLE)。