【问题标题】:Multiply a timeseries by a factor in R将时间序列乘以 R 中的一个因子
【发布时间】:2018-05-16 03:21:36
【问题描述】:

我有以下时间序列:

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 中的第一个(最新)日期晚于第一个(最新)cumfactor 日期,则不应调整它们。

我正在寻找以下结果:

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 循环可能是最好的选择,但我没有成功获得这个结果。

【问题讨论】:

    标签: r loops dataframe time-series multiplication


    【解决方案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 中,时间序列通常以日期的升序表示。

    【讨论】:

    • 谢谢 G. Grothendieck,你知道 na.locf0 是否是 zoo 包的一部分吗?我刚刚安装了 zoo 包,它似乎无法识别该功能。
    • 是的。确保您在 CRAN 上拥有最新版本的 zoo——1.8.0。 packageVersion("zoo")
    猜你喜欢
    • 2018-07-21
    • 2015-04-25
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多