【问题标题】:calculate n days ahead rolling average计算提前 n 天的滚动平均值
【发布时间】:2020-05-13 15:45:11
【问题描述】:

我有以下数据集:

date <- StockData[1:10,2]
x <- c(2,4,2,3,5,1,6,2,3,4)
df <- as.data.frame(cbind(x,date))
df

   x       date
1  2 2019-06-28
2  4 2019-07-01
3  2 2019-07-02
4  3 2019-07-03
5  5 2019-07-04
6  1 2019-07-05
7  6 2019-07-08
8  2 2019-07-09
9  3 2019-07-10
10 4 2019-07-11

现在我想创建一个具有提前 5 (n) 天滚动平均值的新列,因此数据集如下所示:

   x       date five.day.average
1  2 2019-06-28              3.2
2  4 2019-07-01              3
3  2 2019-07-02              3.4
4  3 2019-07-03              3.4
5  5 2019-07-04              3.4
6  1 2019-07-05              3.2
7  6 2019-07-08              NA
8  2 2019-07-09              NA
9  3 2019-07-10              NA
10 4 2019-07-11              NA

换句话说,我想要一个与 zoo 包中的 rollmean 执行相同操作的公式/函数,但不是回到过去,而是回到未来(因为 rollmean 中的 k 不能为负数)。

提前谢谢你!

【问题讨论】:

    标签: r mean finance


    【解决方案1】:

    一个选项是frollmean 来自data.table

    library(data.table)
    setDT(df)[, five.day.average := frollmean(x, 5, align = 'left')]
    df
    #    x       date five.day.average
    # 1: 2 2019-06-28              3.2
    # 2: 4 2019-07-01              3.0
    # 3: 2 2019-07-02              3.4
    # 4: 3 2019-07-03              3.4
    # 5: 5 2019-07-04              3.4
    # 6: 1 2019-07-05              3.2
    # 7: 6 2019-07-08               NA
    # 8: 2 2019-07-09               NA
    # 9: 3 2019-07-10               NA
    #10: 4 2019-07-11               NA
    

    或与rollmean 来自zoo

    rollmean(df$x, 5, align = 'left', fill = NA)
    #[1] 3.2 3.0 3.4 3.4 3.4 3.2  NA  NA  NA  NA
    

    数据

    df <- structure(list(x = c(2L, 4L, 2L, 3L, 5L, 1L, 6L, 2L, 3L, 4L), 
        date = c("2019-06-28", "2019-07-01", "2019-07-02", "2019-07-03", 
        "2019-07-04", "2019-07-05", "2019-07-08", "2019-07-09", "2019-07-10", 
        "2019-07-11")), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9", "10"))
    

    【讨论】:

    • 大声笑,现在我明白了align 的论点......谢谢你的akrun!
    【解决方案2】:

    base中,您可以使用filter 获得滚动平均值。为了让它向前看可以使用rev

    rev(filter(rev(df$x), rep(1/5, 5), sides=1))
    # [1] 3.2 3.0 3.4 3.4 3.4 3.2  NA  NA  NA  NA
    

    【讨论】:

    • 看起来不错的 GKi!
    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2019-09-09
    • 2015-02-12
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多