我有以下时间序列:
ts <- cbind(data.frame(date=seq(as.Date("2017/11/01"), by = "day", length.out = 30)),value=rep(5,30))
ts <- ts[order(ts$date, decreasing=T),]
我想通过以下在某些特定日期具有值的累积因子进行调整:
cf <- cbind(data.frame(date=as.Date(c("2017/11/28", "2017/11/25","2017/11/04","2017/09/25"))),cumfactor=c(0.8,0.7,0.6,.05))
这样,ts上每个日期的值将由相应日期的cf上的cumfactor乘以(调整),并且cumfactor将用于后续(较早)日期,直到下一个cumfactor出现在较早的日期。 ts中的第一个(最新)日期如果晚于第一个(最新的)因子日期,则不应调整。
我正在寻找以下结果:
result <- cbind(data.frame(date=seq(as.Date("2017/11/01"), by = "day", length.out = 30)),value=c(3,3,3,3,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,3.5,4,4,4,5,5))
result <- result[order(result$date, decreasing=T),]
我的猜测是for循环可能是最佳选择,但我没有成功获得此结果。
答案 0 :(得分:1)
合并ts和cf,结转因子并将它们相乘。
library(zoo)
m <- merge(ts, cf, all.x = TRUE)[nrow(ts):1, ]
transform(m, value = value * na.fill(na.locf0(cumfactor), 1))
我们保留了您在问题中的降序日期序列,但请注意,在R中,正常时间序列以日期的升序表示。