2016-09-20 80 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;