2016-08-29 2 views
0

J'ai un problème de programmation SAS que je ne peux pas résoudre seul et je suis reconnaissant pour tout imput.SAS: Calcul des moyennes effondrées et pondérées

Je veux effondrement des données dans un ensemble de données par variable et résumer/moyenne deux variables basées sur les poids donnés par une autre variable et les Soustraire les uns des autres:

Exemple de données

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 

maintenant: Je veux la moyenne pondérée par le volume de mesure1 et deux, puis calculer mesure1-mesure2. Tout cela alors regroupé par les drapeaux A et B:

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) 

donc essentiellement effondrement mais avec des mesures pondérées en fonction du volume, puis déduire les deux. Merci pour toute contribution!

Meilleur

Répondre

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

Hé, merci, ça marche plutôt bien. Comme c'est juste un exemple, dans l'ensemble de données réel j'ai plusieurs dates et pour chaque j'ai besoin des calculs par drapeau. Y a-t-il une chance que tu puisses m'aider à intégrer ça? Le grouper par date avant le drapeau à la fin n'a pas fonctionné ... Meilleur – MaBo88

+0

@ MaBo88 Ajoutez la date pour sélectionner et grouper par la déclaration. – Reeza

+0

Très bien, utilisé Proc SQL mais incroyable de voir que proc résumé/moyens et étape de données fonctionnent également. – MaBo88

0

Cela peut se faire en une seule datastep en utilisant deux SET imbriquées déclarations (souvent appelées à double Do-boucle-de-Whitlock). La première boucle agrège la valeur VOLUME. Dans la deuxième boucle, les formules sont calculées. Une seule valeur par groupe va à la sortie.

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

Merci pour l'aide! Cela a presque fonctionné pour moi mais je vais avec Proc SQL maintenant. – MaBo88

0

Si vous êtes à l'aise avec un résumé proc/signifie que vous pouvez faire la plupart du travail sur le terrain avec elle:

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

Fonctionne aussi, merci! – MaBo88