Sas 如何从';Out=';选项

Sas 如何从';Out=';选项,sas,enterprise-guide,Sas,Enterprise Guide,我在《SAS企业指南》中有一个流程,它主要由数据视图而不是表组成,以便存储在工作库中 问题是,我需要从一个数据视图中计算百分位数(使用proc单变量),并将其左键连接到最终的表(如我的流程图的屏幕截图所示) 是否有任何方法可以将单变量过程中的outfile指定为数据视图,以便该过程不会计算流中它之前的所有内容?当百分位数与最终表格合并时,将再次计算流量,因此我的处理时间实际上增加了一倍 请在下面查找单变量程序的代码 proc univariate data=WORK.QUERY_FOR_SGF

我在《SAS企业指南》中有一个流程,它主要由数据视图而不是表组成,以便存储在工作库中

问题是,我需要从一个数据视图中计算百分位数(使用proc单变量),并将其左键连接到最终的表(如我的流程图的屏幕截图所示)

是否有任何方法可以将单变量过程中的outfile指定为数据视图,以便该过程不会计算流中它之前的所有内容?当百分位数与最终表格合并时,将再次计算流量,因此我的处理时间实际上增加了一倍

请在下面查找单变量程序的代码

proc univariate data=WORK.QUERY_FOR_SGFIX noprint;
var CSA_Price;
by product_id;

output out= work.CSA_Percentiles_Prod

pctlpre= P
pctlpts= 40 to 60 by 10;

run;

在SAS中,我的理解是,诸如
proc univariate
之类的过程通常不能生成视图作为输出。我能想到的唯一解决方法是在数据步骤中复制proc逻辑,并从数据步骤生成视图。您可以这样做,例如将变量转换为临时数组并使用函数

下面是一个简单的例子:

data example /view = example;
  array _height[19]; /*Number of rows in sashelp.class dataset*/

  /*Populate array*/
  do _n_ = 1 by 1 until(eof);
    set sashelp.class end = eof;
    _height[_n_] = height;
  end;

  /*Calculate quantiles*/
  array quantiles[3] q40 q50 q60;
  array points[3] (40 50 60);
  do i = 1 to 3;
    quantiles[i] = pctl(points[i], of _height{*});
  end;

  /*Keep only the quantiles we calculated*/
  keep q40--q60;
run;
通过更多的工作,您还可以使这种方法按组返回单个的百分位数,而不是一次返回整个数据集的百分位数。为此,您需要编写一个双道循环,例如:

data example;
  array _height[19];
  array quantiles[3] q40 q50 q60;
  array points[3] _temporary_ (40 50 60);

  /*Clear heights array between by groups*/
  call missing(of _height[*]);

  /*Populate heights array*/
  do _n_ = 1 by 1 until(last.sex);
    set class end = eof;
    by sex;
    _height[_n_] = height;
  end;

  /*Calculate quantiles*/
  do i = 1 to 3;
    quantiles[i] = pctl(points[i], of _height{*});
  end;

  /* Output all rows from input dataset, with by-group quantiles attached*/
  do _n_ = 1 to _n_;
    set class;
    output;
  end;
  keep name sex q40--q60;
run;

为什么要生成百分位数,然后重新合并它们?也许您还需要一些其他过程,如PROC RANK?我只是单独创建百分位,因为我使用的是SAS Enterprise guide,并且在标准查询生成器中无法生成百分位(或者您可以吗?),因此我必须单独创建它们,然后将它们加入主表。