Как суммировать по вертикали диапазон переменных c в SAS? - PullRequest
0 голосов
/ 12 марта 2020

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

Pro c означает, что / pro c summary и pro c print не справляются со мной.

Ранее мне давали следующий код:

`%let month = month name;
%put &month.;

data new_totals;
set Final_&month. end=end;  
&month._sum + &month._final;    
/*feb_sum + &month._final;*/
output;                
if end then do;         
measure = 'Total';    
&month._final = &month._sum;  
/*Feb_final = feb_sum;*/
output;               
end;
drop &month._sum;   
run; `

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

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

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Может быть лучше использовать процедуру отчетности, такую ​​как PRINT или REPORT, для получения желаемого результата.

data have;
  length group $20;
  do group = 'A', 'B', 'C';
    array month_totals jan2020 jan2019 feb2020 feb2019 mar2019 apr2019 may2019 jun2019 jul2019 aug2019 sep2019 oct2019 oct2019 nov2019 dec2019;
    do over month_totals;
      month_totals  = 10 + floor(rand('uniform', 60));
    end;
    output;
  end;
run;

ods excel file='data_with_total_row.xlsx';

proc print noobs data=have;
  var group ;
  sum jan2020--dec2019;  
run;

proc report data=have;
  columns group jan2020--dec2019;
  define group / width=20;
  rbreak after / summarize;
  compute after;
    group = 'Total';
  endcomp;
run;

ods excel close;

enter image description here

Структура данных

Наборы данных, с которыми вы работаете, являются «сложными», потому что аспект данных на самом деле находится в метаданных, то есть в имени столбца. Еще более удачный подход в SAS - использовать категориальные данные со столбцами

  • group (категориальная роль)
  • month (категориальная роль)
  • total (непрерывная роль)

Такие данные могут быть легко отфильтрованы с помощью предложения where, а процедуры отчетности, такие как REPORT и TABULATE, могут использовать переменную month в class оператор.

Пример:

data have;
  length group $20;
  do group = 'A', 'B', 'C';
    do _n_ = 0 by 1 until (month >= '01feb2020'd);
      month = intnx('month', '01jan2018'd, _n_);
      total = 10 + floor(rand('uniform', 60));
      output;
    end;
  end;
  format month monyy5.;
run;

proc tabulate data=have;
  class group month;
  var total;
  table 
    group all='Total'
    ,
    month='' * total='' * sum=''*f=comma9.
  ;
  where intck('month', month, '01feb2020'd) between 0 and 13;
run;


proc report data=have;
  column group (month,total);
  define group / group;
  define month / '' across order=data ;
  define total / '' ;

  where intck('month', month, '01feb2020'd) between 0 and 13;
run;
0 голосов
/ 12 марта 2020

Вот базовый c способ. Заимствованные данные образца от Ричарда.

data have;
  length group $20;
  do group = 'A', 'B';
    array months jan2020 jan2019 feb2020 feb2019 mar2019 apr2019 may2019 jun2019 jul2019 aug2019 sep2019 oct2019 oct2019 nov2019 dec2019;
    do over months;
      months  = 10 + floor(rand('uniform', 60, 1));
    end;
    output;
  end;
run;

proc summary data=have;
    var _numeric_;
    output out=temp(drop=_:) sum=;
run;

data want;
    set have temp (in=t);
    if t then group='Total';
run;
...