## 3.5 Reduce

Sometimes, we want to get a final result by applying operation one by one.

### 3.5.1 On vector

For example, 2-day moving average is $$EMA_{t}=\frac{1}{3}p_{t}+\frac{2}{3}EMA_{t-1}$$.

The following example shows the 2-day EMA with initial EMA being 5.

price <- 1:10
ema <- 5
for (i in 1:length(price)) {
ema <- (ema + 2*price[i])/3
}
ema
## [1] 9.500093

The following example use Reduce to simplify the code.

price <- 1:10
initial <- 5
ema <- Reduce(function(x,y){(x+2*y)/3},price,initial)
ema
## [1] 9.500093

### 3.5.2 On list

The following example shows how we can combine data sets.

HI <- data.frame(stock=c(1,2), high=c(7,8))
LO <- data.frame(stock=c(1,2), low=c(1,2))
OP <- data.frame(stock=c(1,2), open=c(3,6))
CL <- data.frame(stock=c(1,2), close=c(5,5))
df <-merge(HI,LO)
df <-merge(df,OP)
df <-merge(df,CL)
df
##   stock high low open close
## 1     1    7   1    3     5
## 2     2    8   2    6     5

Since merging is one by one on the data.frame, we just need to create a list of data.frame.

HI <- data.frame(stock=c(1,2), high=c(7,8))
LO <- data.frame(stock=c(1,2), low=c(1,2))
OP <- data.frame(stock=c(1,2), open=c(3,6))
CL <- data.frame(stock=c(1,2), close=c(5,5))
df <- Reduce(function(x,y) {merge(x,y)}, list(HI, LO, OP, CL))
df
##   stock high low open close
## 1     1    7   1    3     5
## 2     2    8   2    6     5