R:将函数应用于xts对象

时间:2016-04-19 06:07:31

标签: r function date apply xts

我有一个xts对象:

Anchor_Date <- as.Date("2016-04-19")
End_Date <- as.Date(Anchor_Date + years(5))
Number_Days <- End_Date - Anchor_Date  
Xts_Object <- xts(rep(NA, Number_Days + 1), as.Date(Anchor_Date) + 0:Number_Days)

我还有一个函数,它占用日期和开始日期之间的平方年数:

Time_Squared_Func <- function(Start_Date, Date) {
  Time_Squared <- as.numeric(((Date - Start_Date) / 365) ^ 2)
  Return (Time_Squared)
}

我想将函数应用于xts对象,使用常量Start_Date =系列中的第一天,但​​将Date参数作为xts对象该行中的日期。结果应该是第一行中的0,在2017-04-19上逐渐增加到1,在2018-04-19等上增加到4 ......

https://codereview.stackexchange.com/questions/39180/best-way-to-apply-across-an-xts-object

这表明vapply比应用或lapply快得多,所以如果可能的话,使用vapply是理想的,但任何工作都很好。

谢谢。

1 个答案:

答案 0 :(得分:0)

使用lapply和rbind

require(lubridate)

Anchor_Date <- as.Date("2016-04-19")
End_Date <- as.Date(Anchor_Date + years(5))
Number_Days <- End_Date - Anchor_Date  
Xts_Object <- xts(rep(NA, Number_Days + 1), as.Date(Anchor_Date) +  0:Number_Days)

Time_Squared_Func <- function(Start_Date, Date) {
  Time_Diff = as.numeric(Date - Start_Date)
  Time_Squared <- (Time_Diff / 365) ^ 2
  return (Time_Squared)
}

将第一个日期和每个行索引(日期)传递给Time_Squared_Func函数并为最终结果rbind输出

first_date = as.Date(index(first(Xts_Object)))

ts_lapply = do.call(rbind,lapply(as.Date(index(Xts_Object)),function(x) Time_Squared_Func(first_date ,x) ) )

ts_xts = xts(ts_lapply,as.Date(index(Xts_Object)))

for(i in 1:5) print(ts_xts[Anchor_Date+years(i)])
           # [,1]
# 2017-04-19    1
           # [,1]
# 2018-04-19    4
           # [,1]
# 2019-04-19    9
               # [,1]
# 2020-04-19 16.02193
              # [,1]
# 2021-04-19 25.0274