你可以直接使用宏做到這一點無需額外的數據的步驟,通過讀取數據集:
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