【问题标题】:Finding cumulative maximum of Date objects查找 Date 对象的累积最大值
【发布时间】:2019-05-21 16:05:01
【问题描述】:

我正在尝试查找 data.frame 中列的累积最大日期。我的数据看起来像:

df <- data.frame(id = c(1, 2, 3, 4, 5, 7, 8, 11, 3, 12),
                 date = sample(seq(as.Date("2015-01-01"), as.Date("2017-01-01"), by = "day"), 10))

# > df
   id       date
1  15 2015-11-22
2   2 2016-06-23
3   4 2015-03-21
4   6 2015-04-09
5   5 2015-05-20
6   1 2016-01-03
7  13 2015-01-01
8  14 2016-11-24
9   7 2016-12-23
10  9 2016-08-12

预期结果

我希望以这样的结尾:

# > df
   id       date
1  15 2015-11-22
2   2 2016-06-23
3   4 2016-06-23
4   6 2016-06-23
5   5 2016-06-23
6   1 2016-06-23
7  13 2016-06-23
8  14 2016-11-24
9   7 2016-12-23
10  9 2016-12-23

我已经用dplyr::cummax() 成功地找到了数值变量的累积最大值,但是这个函数不适用于Date 对象。是否有另一个函数(可能在基础 R 中)类似于 cumsum() 并且可以在日期上使用?

【问题讨论】:

    标签: r date dplyr


    【解决方案1】:

    您可以转换为数字,然后再将其转换回来,注意类 Date 的起源是 1970-01-01

    set.seed(1)
    df <- data.frame(id = c(1, 2, 3, 4, 5, 7, 8, 11, 3, 12),
                     date = sample(seq(as.Date("2015-01-01"), as.Date("2017-01-01"), by = "day"), 10))
    
    
    df$cum_max_date <- as.Date(cummax(as.integer(df$date)), "1970-01-01")
    
    df
    #>    id       date cum_max_date
    #> 1   1 2015-07-14   2015-07-14
    #> 2   2 2015-09-30   2015-09-30
    #> 3   3 2016-02-23   2016-02-23
    #> 4   4 2016-10-24   2016-10-24
    #> 5   5 2015-05-27   2016-10-24
    #> 6   7 2016-10-15   2016-10-24
    #> 7   8 2016-11-16   2016-11-16
    #> 8  11 2016-04-24   2016-11-16
    #> 9   3 2016-03-31   2016-11-16
    #> 10 12 2015-02-14   2016-11-16
    

    reprex package (v0.2.1) 于 2019 年 5 月 21 日创建

    【讨论】:

      【解决方案2】:

      你也可以使用zoo::rollapply

      df$cum_max_date <- zoo::rollapplyr(df$date, 1:nrow(df), max)
      

      set.seed(1) 的结果(与 zack 的结果相同)

         id       date cum_max_date
      1   1 2015-07-14   2015-07-14
      2   2 2015-09-30   2015-09-30
      3   3 2016-02-23   2016-02-23
      4   4 2016-10-24   2016-10-24
      5   5 2015-05-27   2016-10-24
      6   7 2016-10-15   2016-10-24
      7   8 2016-11-16   2016-11-16
      8  11 2016-04-24   2016-11-16
      9   3 2016-03-31   2016-11-16
      10 12 2015-02-14   2016-11-16
      

      【讨论】:

        猜你喜欢
        • 2022-06-10
        • 2022-12-31
        • 1970-01-01
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多