%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?
答案 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;然后将<=
更改为<
。