查找日期对象的累积最大值

时间:2019-05-21 16:05:02

标签: r date dplyr

我正在尝试查找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()并且可以在日期上使用?

2 个答案:

答案 0 :(得分:2)

您可以转换为数字,然后再转换回数字,请注意类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-05-21创建

答案 1 :(得分:2)

您也可以使用zoo::rollapply

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

结果为set.seed(1)(与扎克的结果相同)

   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