我使用以下代码将75%分位数放入宏变量quant75。我想仅使用一个数据步骤执行此操作,省略创建的额外数据集cap_val。
proc univariate data=site_visits;
VAR total_visits ;
;
output out=cap_val
pctlpts = 75
pctlpre = pcap
run
;
data _null_;
set cap_val;
call symput("quant75",pcap75);
run;
%put &quant75;
答案 0 :(得分:2)
不确定为什么要在一个数据步骤中执行此操作。但你可以试试这个:
data _null_;
if _n_=1 then do;
call execute('proc univariate data=sashelp.class;
var weight;
output out=cap_val pctlpts = 75 pctlpre = pcap; ');
call execute('data _null_;
set cap_val;
call symput("quant75",pcap75);
run;');
end;
run;
%put &quant75;
答案 1 :(得分:0)
您可以在没有其他数据步骤的情况下执行此操作,方法是直接使用宏读取数据集:
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;