Как создать представление данных SAS из опции «Out =»? - PullRequest
0 голосов
/ 13 июня 2018

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

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

enter image description here

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

Ниже приведен код для одномерной процедуры

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;

1 Ответ

0 голосов
/ 13 июня 2018

Насколько я понимаю, в 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;
...