2016-09-20 81 views
1

我正在使用下面的代碼將75%的分位數放入一個宏變量quant75中。我只想使用一個數據步驟來完成此操作,省略了創建的額外數據集cap_val。如何使用一個數據步將分位數轉換爲SAS宏變量?

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; 
+1

爲什麼你想避免在這裏使用數據步驟?你可以使用proc sql select來代替,但我敢肯定你不能一步完成這個任務(即讓proc單變量返回一個宏變量) – superfluous

回答

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; 
+0

lol - 好的答案 –

+0

愚蠢的約束要求同樣愚蠢的做法! – user667489

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;