Агрегирование с помощью Proc SQL - PullRequest
1 голос
/ 08 марта 2012

Предположим, у меня есть набор данных в форме:

A B C
1 3 5
1 4 8
1 3 3
2 2 2
2 7 6
2 3 3
3 4 4 
3 4 7
3 2 8

Теперь я хочу взять средневзвешенное значение для каждого сегмента A, а затем сложить их по A. Например, в A var для 1, я хочу взять взвешенное среднее значение как (3 * 5 + 4 * 8 + 3). * 3) / (3 + 4 + 3). А затем сложите, чтобы получить 5.6. То же самое с двумя другими сегментами A. Итак, наконец, таблица выглядит следующим образом:

A B C   D
1 3 7 5.6
2 6 6 7
3 5 9 8.2

Спасибо.

Ответы [ 2 ]

7 голосов
/ 08 марта 2012

Просто чтобы предоставить альтернативный подход, вы можете использовать оператор WEIGHT в PROC SUMMARY для достижения того же результата.Единственное, что мне не ясно из вашей таблицы финальной таблицы, это откуда взяты значения столбцов B & C (я оставил их в своем решении ниже).

2 голосов
/ 08 марта 2012

Вы можете найти решение ниже.Мне интересно ваш результат.Для A = 2 средневзвешенное значение должно быть (2 * 2 + 7 * 6 + 3 * 3) / (2 + 7 + 3), около 4,5.Почему здесь у вас 7?

data test;
input a  b  c ;
datalines;
1 3 5
1 4 8
1 3 3
2 2 2
2 7 6
2 3 3
3 4 4 
3 4 7
3 2 8
;
run;

proc sql;
create table agg as 
select a, b, c, sum(b*c)/sum(b) as d from test
group by a;
quit;

proc sort data=agg nodupkey;
by a d;
run;
...