你可以直接使用宏做到这一点无需额外的数据的步骤,通过读取数据集:
proc univariate data=site_visits;
var total_visits ;
output out=cap_val
pctlpts = 75
pctlpre = pcap
run;
%let dsid = %sysfunc(open(work.cap_val));
%syscall set(dsid);
%let rc = %sysfunc(fetch(&dsid));
%let rc = %sysfunc(close(&dsid));
%let quant75 = &pcap75;
%put &=quant75;
被警告说,这将创建一个宏变量每个变量在你的输入数据集中(可能有问题也可能不成问题)。
就你而言,虽然我建议坚持使用的方法,因为它更容易阅读。
此外(作为@superfluous提到),您不可能直接在univariate procedure中创建此宏变量。相反,你需要将创建,然后查询输出数据集。
不知道为什么,这应该是一个问题,但对缓解任何问题,你可以尝试写出来_DATA_
(创建一个唯一命名的数据集,如DATA1),然后使用&syslast
删除 - 如下:
proc univariate data=site_visits;
var total_visits ;
output out=_DATA_
pctlpts = 75
pctlpre = pcap
run;
proc sql noprint;
select pcap75 into: quant75 from &syslast;
drop table &syslast;
为什么你想避免在这里使用数据步骤?你可以使用proc sql select来代替,但我敢肯定你不能一步完成这个任务(即让proc单变量返回一个宏变量) – superfluous