Группировка дочерних элементов и отображение родительской суммы - PullRequest
1 голос
/ 04 марта 2020

У меня есть следующая таблица

+-------+--------+---------+
| group | item   |  value  |
+-------+--------+---------+
|   1   |   a    |   10    |
|   1   |   b    |   20    |
|   2   |   b    |   30    |
|   2   |   c    |   40    |
+-------+--------+---------+

Я хотел бы сгруппировать таблицу по group, вставить сгруппированную сумму в value, а затем разгруппировать:

+-------+--------+
| item  | value  |
+-------+--------+
|   1   |   30   |
|   a   |   10   |
|   b   |   20   |
|   2   |   70   |
|   b   |   30   |
|   c   |   40   |
+-------+--------+

Цель результата - интерпретировать первый столбец как элементы a и b, принадлежащие группе 1 с суммой 30, и элементы b и c, принадлежащие группе 2 с суммой 70.

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

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

data have;
infile datalines;
input group $ item $ value @@; datalines;
 1 a 10   1 b 20   2 b 30   2 c 40  
;

proc report data=have;
  column group item value;
  define group / order order=data noprint;
  break before group / summarize;
  compute item;
    if missing(item) then item=group;
  endcomp;
run;

enter image description here

0 голосов
/ 04 марта 2020

Я предполагаю, что group и item являются символьными переменными

data have;
infile datalines firstobs=4 dlm='|';
input group $ item $ value;
datalines;
+-------+--------+---------+
| group | item   |  value  |
+-------+--------+---------+
|   1   |   a    |   10    |
|   1   |   b    |   20    |
|   2   |   b    |   30    |
|   2   |   c    |   40    |
+-------+--------+---------+
;

data want (keep=group value);
    do _N_=1 by 1 until (last.group);
        set have;
        by group;
        v + value;
    end;
    value = v;output;v=0;
    do _N_=1 to _N_;
        set have;
        group = item;
        output;
    end;
run;
...