Как создать представление данных SAS из параметра «Out=»?

У меня есть поток процессов в SAS Enterprise Guide, который состоит в основном из представлений данных, а не таблиц, для хранения в рабочей библиотеке.

Проблема в том, что мне нужно рассчитать процентили (используя proc univariate) из одного из представлений данных и левое присоединение к итоговой таблице (показано на снимке экрана моего процесса).

введите здесь описание изображения

Есть ли способ указать выходной файл в одномерной процедуре как представление данных, чтобы процедура не вычисляла все до нее в потоке? Когда процентили остаются присоединенными к итоговой таблице, поток вычисляется снова, поэтому я фактически удваиваю время обработки.

Пожалуйста, найдите код для одномерной процедуры ниже

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;

person Henry Sumner    schedule 13.06.2018    source источник
comment
Почему вы создаете процентили, а затем повторно объединяете их? Возможно, вам нужна какая-то другая процедура, например PROC RANK?   -  person Tom    schedule 13.06.2018
comment
Я создаю процентили отдельно только потому, что использую руководство SAS Enterprise, а создание процентилей — это не то, что вы можете сделать в стандартном конструкторе запросов (или можете?), поэтому мне нужно создать их отдельно, а затем оставить присоединиться к ним. к основному столу.   -  person Henry Sumner    schedule 13.06.2018


Ответы (1)


Насколько я понимаю, в SAS процессы, такие как proc univariate, обычно не могут создавать представления в качестве вывода. Единственный обходной путь, который я могу придумать, - это повторить логику процесса в шаге данных и создать представление из шага данных. Вы можете сделать это, например. путем переноса ваших переменных во временные массивы и использования pctl.

Вот простой пример:

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;

Приложив немного больше усилий, вы также можете заставить этот подход возвращать процентили для отдельных групп, а не для всего набора данных сразу. Для этого вам нужно написать двойной цикл DOW, например:

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;
person user667489    schedule 13.06.2018