2016-08-29 3 views
0

У меня проблема программирования SAS, которую я не могу решить самостоятельно, и я благодарен за любой ввоз.SAS: расчеты сбрасывания и взвешенных средних значений

Я хочу, чтобы свернуть данные в наборе данных по переменной и суммировать/средние двух переменных на основе весов, приписываемых другой переменной и вычитать их друг от друга:

Пример данных

number flag  volume measure1 measure2 
1   A   1   2   2   
2   B   2   4   5 
3   A   5   8   20 
4   B   10  4   1 
5   A   9   10  11 
6   B   5   2   9 
7   A   4   11  23 
8   B   3   1   8 

Сейчас: Я хочу средневзвешенное по объему значение 1 и два, а затем вычислить меру 1-меру2. Все это затем сгруппировано по флагам А и В:

Number Flag  Volume  VolWeightMeasure1  VolWeightMeasure2  FinalMeasure 
1  A  19  ((1/19)*2)+((5/19)*8)+...  ...   (VolWeightMeasure1-VolWeightMeasure2) 
2  B  20  ((2/20)*5)+((10/20)*1)+... ...   (VolWeightMeasure1-VolWeightMeasure2) 

Так в основном разрушается, но с мерами объема взвешенными, а затем вычитая два. Спасибо за любой вклад!

Лучшие

ответ

0
proc sql; 
    select flag,sum_volume,sum1/sum_volume as volweightmeasure1,sum2/sum_volume as volweightmeasure2, 
      calculated volweightmeasure1-calculated volweightmeasure2 as finalmeasure 
    from (select flag,sum(volume) as sum_volume, sum(volume*measure1) as sum1, sum(volume*measure2) as sum2 from have group by flag); 
quit; 
+0

Эй, спасибо, это работает очень хорошо. Поскольку это всего лишь пример, в реальном наборе данных у меня есть несколько дат, и для каждого мне нужны вычисления за флаг. Есть ли шанс, что вы могли бы помочь мне в этом разобраться? Группировка по дате перед флагом в конце не сработала ... Best – MaBo88

+0

@ MaBo88 Добавить дату для выбора и группировки по заявлению. – Reeza

+0

Отличный, используемый Proc SQL, но удивительный, чтобы увидеть, что процесс резюме/средства и шаг данных также работают. – MaBo88

0

Это может быть сделано в одном datastep с помощью двух вложенных SET заявления (часто называют двойной Do-Loop-из-Уитлок).

Первый цикл суммирует значение VOLUME. Во втором цикле вычисляются формулы. На выход выводится только одно значение для каждой группы.

data have; 
input flag $ volume measure1 measure2; 
datalines; 
     A   1   2   2   
     B   2   4   5 
     A   5   8   20 
     B   10  4   1 
     A   9   10  11 
     B   5   2   9 
     A   4   11  23 
     B   3   1   8 
run; 

proc sort data = have; by flag; run; 
data want; 

    do _n_ = 1 by 1 until (last.flag); 
    set have; 
    by flag; 

    sum_vol = sum(sum_vol,volume); 
    end; 

    do _n_ = 1 by 1 until (last.flag); 
    set have; 
    by flag; 

    VolWeightMeasure1 = sum(VolWeightMeasure1,(volume/sum_vol)*measure1); 
    VolWeightMeasure2 = sum(VolWeightMeasure2,(volume/sum_vol)*measure2); 
    end; 

    FinalMeasure = VolWeightMeasure1 - VolWeightMeasure2; 

drop volume measure1 measure2; 
rename sum_vol = Volume; 
run; 
+0

Спасибо за помощь! Это почти сработало для меня, но теперь я иду с Proc SQL. – MaBo88

0

Если вы знакомы с резюме Proc/означает, что вы можете сделать большую часть беготни с ним:

proc summary data=have nway; 
    class flag; 
    var measure1 measure2; 
    wgt volume; 
    output out=wantcomp(drop=_:) sumwgt=Volume mean=VolWeightMeasure1 VolWeightMeasure2; 
run; 

data want; 
    set want; 
    FinalMeasure = VolWeightMeasure1-VolWeightMeasure2; 
run; 
+0

Также работает, спасибо! – MaBo88

Смежные вопросы