2016-08-29 23 views
0

私は自分で解決できないSASプログラミング問題を抱えています。SAS:折りたたみと加重平均計算

私は変数で、データセット内のデータを崩壊し、別の変数によって与えられた重みに基づいて/平均2つの変数を要約し、お互いからそれらを減算するとします

例データ今

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 

:私は、measure1と2の量加重平均を求めてから、measure1-measure2を計算します。その後、フラグAと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) 

だから、基本的に崩壊したが、ボリューム加重措置し、その後2を控除しています。 ありがとうございます!

ベスト

答えて

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

ねえ、ありがとう、それはかなり良いです。これは単なる例であるため、実際のデータセットでは、いくつかの日付があり、それぞれに対してフラグごとの計算が必要です。あなたが私にそれを築くのを手伝ってくれるチャンスはありますか?最後のフラグの前に日付でグループ化してもうまくいきませんでした...ベスト – MaBo88

+0

@ MaBo88選択してグループ化する日付を追加してください。 – Reeza

+0

すばらしい、Proc SQLを使用しましたが、proc summary/meansとdata stepも機能していることを確認するのはすばらしいことです。 – MaBo88

0

これは、2つの入れ子SET文(多くの場合、二重のDO-ループ・オブ・ホイットロックと呼ばれる)を使用して、単一のdatastepで行うことができます。

最初のループは、VOLUMEの値を集約します。 2番目のループでは、数式が計算されます。 グループごとに1つの値だけが出力に送られます。

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

関連する問題