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