2017-06-19 84 views
0

私はSASには比較的新しいので、変数に基づいて移動平均を計算する必要があります。 私が説明するためにいくつかのサンプルコードを作った:SASでの移動平均の計算

DATA testData; 
input shop year sales; 
datalines; 
01 01 20000 
01 02 23500 
01 03 21020 
02 01 23664 
02 02 15420 
02 03 14200 
03 01 25623 
03 02 12500 
03 03 20030 
; 
run; 

DATA average; 
retain y 0; 
set testData; 
y = y + sales; 
avg = y/_n_; 
run; 

これは私にすべての私の販売のための平均値を示します。私がやりたいことは、店舗ごとの平均値と昨年の平均値、そしてその店のすべての年の平均値を取得することだけです。その後、次の店をもう一度始める。うまくいけば、これは何らかの意味があります。店舗1の年数の移動平均が店舗2の平均値に影響しないようにしたいと考えています。

+2

技術的に、あなたは、累積平均ではなく、移動平均計算(ピリオドの同じ番号を使用するが、各時間を通してシフト)されます。これは@vasilijで示されるように、データステップで簡単にコーディングできます。移動平均はコード化するのがより複雑ですが、SAS ETSのライセンスがあれば、 'proc expand'で簡単に行えます。 – Longfish

+0

PROC MEANSとWAYSおよびTYPESステートメントを見てください。彼らは結果のレベルを制御することができます。私はそれが長期的にはデータ・ステップよりも優れた解決策であると考えています。 – Reeza

答えて

2

あなたがする必要があることは、新しい店舗の数をカウントするたびに平均をリセットすることです。また、独自のレコードカウンターを使用する必要があります。ここでは、改善のコードです:

DATA testData; 
    input shop year sales; 
    datalines; 
01 01 20000 
01 02 23500 
01 03 21020 
02 01 23664 
02 02 15420 
02 03 14200 
03 01 25623 
03 02 12500 
03 03 20030 
; 
run; 

PROC SORT DATA=WORK.TESTDATA 
    OUT=Sorted; 
    BY shop year; 
RUN; 

DATA average (drop=n); 
    set Sorted; 
    by shop; 
    if first.shop then 
     do; 
      y = 0; 
      n = 0; 
     end; 
    n + 1; 
    y + sales; 
    avg = y/n; 
run; 

また、声明を保持することが通知が必要でないことは、あなたの合計文が代わりに「私は= I yを+」の「私はY +」と表現される表現です。

グループ別の詳細については、SAS Support docを参照してください。

結果:

Result

+0

答えと編集をありがとう! – buffalol