SAS宏 - 数组

时间:2016-03-08 01:08:02

标签: sas-macro

%macro nextNB(ds);
%local dsid nv rc;
%let dsid = %sysfunc(open(&ds));
%let nv = %sysfunc(smallest(2, &dsid));
%let rc =%sysfunc(close(&dsid));
&nv
%mend nextNB;

%put %nextNB(WORK.TEST);

& dsid返回值为5,7和9的数据集。如何更改我的宏函数,使其返回第二个最小值7?

2 个答案:

答案 0 :(得分:1)

如果您只想使用现有数据集并将K值放入宏变量,那么只需使用数据步骤即可。

让我们模仿将数据集名称,变量名称,整数和目标宏变量名称作为宏变量传递。

 %let ds=list ;
 %let var=value ;
 %let k=2 ;
 %let target=new_mv ;

然后您的数据步骤就是。

 data _null_;
   set &list firstobs=&k obs=&k ;
   call symputx("&target",&var);
 run;

如果它没有排序,那么也许你可以先排序?

 proc sort data=&ds nodupkey ;
   by &var;
 run;

答案 1 :(得分:0)

要将此作为宏功能执行,您需要读取整个数据集。我不确定SMALLEST()函数是否能正常工作。你想怎么处理关系?这是一个找到第二个最小值并忽略重复值的程序。

%macro nextNB(ds,var);
%local dsid rc minv nv &var ;
%*----------------------------------------------------------------------
Open the dataset and link dataset variables to macro variables.
Loop until all observations are read.
-----------------------------------------------------------------------;
%let minv=.;
%let nv=.;
%let did=%sysfunc(open(&ds(keep=&var)));
%syscall set(did);
%do %while(not %sysfunc(fetch(&did)));
   %if %sysevalf(. = &minv) %then %let minv=&&&var;
   %else %if %sysevalf(&&&var <= &minv) %then %let minv=&&&var;
   %else %if %sysevalf(. = &nv) %then %let nv=&&&var;
   %else %if %sysevalf(&&&var < &nv) %then %let nv=&&&var;
%end;
%let rc=%sysfunc(close(&did));
&nv.
%mend nextnb;


data list;
 do value= 5,9,5,7,8 ; output; end;
run;
%put %nextnb(list,value);

这将导致找到7作为第二个最小值。

如果您希望它返回5,因为数据中有两个5&#39;然后将<=更改为<