如何仅使用一个数据步骤将SAS中的分位数变为宏变量?

时间:2016-09-20 11:54:19

标签: sas

我使用以下代码将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;

2 个答案:

答案 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;