2017-06-19 533 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