Столбцы суммы на основе нескольких других столбцов — SAS

#sas #sum

Вопрос:

Я пытаюсь суммировать некоторые столбцы на основе нескольких других столбцов, а затем создать новую таблицу с результатами.

Допустим, у меня есть следующие данные:

Col1 Col2 Col3 Col4 Col5 Col6
АААА BBBB CCCC DDDD 3 1
АААА BBBB CCCC DDDD 5 1
WWWW ХХХХ YYYY ЗЗЗЗЗ 1 4
WWWW ХХХХ YYYY ЗЗЗЗЗ 8 2

И я хочу суммировать Col5 и Col6 (отдельно), где Col 1-4 одинаковы. т. Е. Вывод, который я хочу, это:

Col1 Col2 Col3 Col4 Col5 Col6
АААА BBBB CCCC DDDD 8 2
WWWW ХХХХ YYYY ЗЗЗЗЗ 9 6

Я поместил свой код ниже, но он дает мне следующее:

Col1 Col2 Col3 Col4 Col5 Col6
АААА BBBB CCCC DDDD 8 2
АААА BBBB CCCC DDDD 8 2
WWWW ХХХХ YYYY ЗЗЗЗЗ 9 6
WWWW ХХХХ YYYY ЗЗЗЗЗ 9 6

Любая помощь была бы очень признательна:

а) заставьте это работать с кодом.

б) покажите мне лучший (более эффективный?) как это сделать? Я думаю, что я сильно(!) усложнил это (я очень новичок в SAS!).

— Код —

 data XXX;
input Col1 $ Col2 $ Col3 $ Col4 $ Col5 Col6;
datalines;
AAAA BBBB CCCC DDDD 3 1
AAAA BBBB CCCC DDDD 5 1
WWWW XXXX YYYY ZZZZ 1 4
WWWW XXXX YYYY ZZZZ 8 2
;
run;

data test1;
set XXX;
groupID = put(md5(upcase(catx('|',Col1,Col2,Col3,Col4))),hex32.);
run;

proc sort data = test1;
by groupID;
run;

proc summary data = test1;
var Col5 Col6;
by groupID;
Output out = want sum=;
run;

proc sql;
create table test1_results as
select b.Col1,b.Col2,b.Col3,b.Col4, a.*
from want as a
left join test1 as b
on a.groupID = b.groupID;
run;

data Final_table;
set test1_results;
Keep Col1 Col2 Col3 Col4 Col5 Col6;
run;
 

Ответ №1:

Я думаю, вам нужно КРАТКОЕ ИЗЛОЖЕНИЕ процесса. Остальные шаги не нужны. Операторы Key concept — BY или CLASS принимают несколько переменных.

 data XXX;
    input Col1 $ Col2 $ Col3 $ Col4 $ Col5 Col6;
    datalines;
AAAA BBBB CCCC DDDD 3 1
AAAA BBBB CCCC DDDD 5 1
WWWW XXXX YYYY ZZZZ 1 4
WWWW XXXX YYYY ZZZZ 8 2

;
run;

proc summary data=xxx NWAY noprint;
    class col1 col2 col3 col4;
    var Col5 Col6;
    Output out=want (drop=_type_ _freq_) sum=;
run;

proc print data=want;run;