我有一个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是理想的,但任何工作都很好。
谢谢。
答案 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