Как суммировать различные подмножества строк в различные новые столбцы в SAS? - PullRequest
0 голосов
/ 02 апреля 2020

Я хочу вычислить несколько сумм в одном столбце на основе некоторых критериев. Вот небольшой пример использования набора данных sashelp.cars.

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

proc report data=sashelp.cars out=test2;
    column make type,invoice type,msrp;
    define make / group;
    define type / across;
    define invoice / analysis sum;
    define msrp / analysis sum;
    title "Report";
run;

proc print data=test2;
    title "Out table for the report";
run;

proc summary data=test nway missing;
    class make type;
    var invoice msrp;
    output out=sumTest(drop= _Freq_ _TYPE_) sum=;
run;
proc transpose data=sumTest out=test3;
    by make;
    var invoice msrp;
    id type;
run;
proc print data=test3;
    title "Table using proc summary followed by proc transpose";
run;

proc sql undo_policy=none;
    create table test4 as select 
        make,
        sum(case when type='Sedan' then invoice else 0 end) as SedanInvoice,
        sum(case when type='Wagon' then invoice else 0 end) as WagonInvoice,
        sum(case when type='SUV' then invoice else 0 end) as SUVInvoice,
        sum(case when type='Sedan' then msrp else 0 end) as Sedanmsrp,
        sum(case when type='Wagon' then msrp else 0 end) as Wagonmsrp,
        sum(case when type='SUV' then msrp else 0 end) as SUVmsrp
    from sashelp.cars
    group by make;
quit;
run;
proc print data=test4; 
    title "Table using SQL queries and CASE/WHEN to compute new columns";
run;

Вот результат, который я получаю, когда запускаю представленный код.

enter image description here

Первые две таблицы представляют результат и выходную таблицу report процедура. Проблема, с которой я сталкиваюсь при таком подходе - это имена столбцов, создаваемые proc report. Я хотел бы иметь возможность определить их сам, но я не понимаю, как я могу это сделать. Это важно для дальнейших ссылок.

Третья таблица представляет результат части кода proc summary / proc transpose. Проблема с этим подходом заключается в том, что Invoice и MSRP отображаются в виде строк в таблице, а не столбцов. По этой причине я думаю, что proc report лучше.

Последняя таблица представляет использование запроса SQL. Результат именно то, что я хочу, но код тяжелый. Мне нужно сделать много похожих вычислений для моего набора данных, и я считаю, что этот подход громоздок.

Не могли бы вы помочь улучшить один из этих методов?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вы можете просто использовать два шага PRO C TRANSPOSE;

proc summary data=sashelp.cars nway missing;
  where make=:'V';
  class make type;
  var invoice msrp;
  output out=step1(drop= _Freq_ _TYPE_) sum=;
run;
proc transpose data=step1 out=step2;
  by make type ;
  var invoice msrp;
run;
proc transpose data=step2 out=step3(drop=_name_);
  by make;
  id type _name_ ;
  var col1 ;
run;
proc print data=step3;
  title "Table using proc summary followed by 2 proc transpose steps";
run;

Результаты:

                                                  Sedan       Sedan       Wagon       Wagon
Obs    Make          SUVInvoice     SUVMSRP     Invoice        MSRP     Invoice        MSRP

 1     Volkswagen      $32,243      $35,515    $335,813    $364,020     $77,184     $84,195
 2     Volvo           $38,851      $41,250    $313,990    $333,240     $57,753     $61,280
0 голосов
/ 03 апреля 2020

Используйте Proc TABULATE. Очень краткие выражения для указания измерений строки и столбца, определенных желаемой иерархией переменных класса.

Пересечение этих измерений является ячейкой и представляет собой комбинацию значений, которые выбирают значения, для которых статистическая мера отображается в cell.

В вашем случае SUM - это сумма в долларах, что может не иметь смысла, когда ячейка имеет более одного содействующего значения.

Например: имеет ли смысл показывать invoice sum для 11 Volkswagen Sedan, равных $335,813?

Также обратите внимание на инвертированный 'иерархия, используемая для отображения количества участвующих значений.

Пример:

proc tabulate data=sashelp.cars;
  class make type;
  var invoice msrp;

  table 
    make=''
    ,
    type * invoice * sum=''*f=dollar9.   
    type * msrp    * sum=''*f=dollar9.   /* this is an adjacent dimension */

    (invoice msrp) * type * n=''   /* specify another adjacent dimension, with inverted hierarchy */

    /
    box = 'Make'
  ;

  where make =: 'V';
run;

Вывод enter image description here

...