Not applicable

## Calulate Average of previous and Next value

Hi,

I need to calculate Average as shown in below table,
by zone and time.

Average should be of previous and the next number
for ex: for zone A for time 00:30 it is average of demand of time 00:15 and 00:45.

Time Zone demand Average
0:15 A 10 10
0:30 A 20 20
0:45 A 30 17.5
0:15 B 15 15
0:30 B 18 17.5
0:45 B 20 17.5
0:15 C 17 17
0:30 C 19 19
0:45 C 21 11
0:15 D 3 3
0:30 D 8 11
0:45 D 19 8

thanks
5 REPLIES 5
Lapis Lazuli | Level 10

## Re: Calulate Average of previous and Next value

Explore using the LAG function - the SAS DOC section below demonstrates a DATA step approach to obtaining a "Leading Series" calculation.

Scott Barry
SBBWorks, Inc.

http://support.sas.com/documentation/cdl/en/etsug/60372/HTML/default/etsug_tsdata_sect051.htm

lag function site:sas.com

next observation value calculation site:sas.com

Opal | Level 21

## Re: Calulate Average of previous and Next value

While I don't understand your example, the code offered by Howard Schrier at:
will definitely give you a way to average the previous and next values.

HTH,
Art
Rhodochrosite | Level 12

## Re: Calulate Average of previous and Next value

You can also find DATA step examples at:
http://support.sas.com/kb/25/027.html

PROC EXPAND can also be used to calculate moving averages, see:
http://www2.sas.com/proceedings/forum2008/093-2008.pdf
Calcite | Level 5

## Re: Calulate Average of previous and Next value

It really helped. Thank you!
SAS Employee

## Re: Calulate Average of previous and Next value

You can use the cmovave transformation operation in PROC EXPAND:

``````proc expand data=have out=want;
by zone;
id time;
convert demand = avg / transform=(cmovave 3);
run;``````

If you want a pure DATA step approach, you can calculate a lag and lead, then divide. Attached is a program that will let you calculate leads efficiently.

``````%lead(data=have, out=have_lead, var=demand, by=zone);

data want;
by zone time;

lag1_demand = lag(demand);

/* Calculate the denominator and do not set lags for the first value of zone */
if(first.zone) then do;
n = 1;
lag1_demand = .;
end;
else n = 3 - nmiss(lag1_demand, lead1_demand);