2017-06-19 297 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; 

此外,注意保留聲明是沒有必要的是表達你和語句表達爲「我+ Y」,而不是「I = I + Y」。

有關group by的更多信息,請參見SAS Support doc

結果:

Result

+0

感謝您的答案和編輯! – buffalol