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