Должно работать следующее: (1) преобразовать start
в столбец Date
и (2) определить prom
как последнюю дату в start
с reason == "y"
, сгруппированным по id
.
library(data.table)
setDT(b)[, start := as.Date(start)][, prom := last(start[reason == "y"]), by = "id"][]
#> Registered S3 method overwritten by 'xts':
#> method from
#> as.zoo.xts zoo
#> id group start end reason prom
#> 1: 1 a 2009-01-01 2009-12-31 x 2016-08-15
#> 2: 1 a 2010-01-01 2010-12-31 x 2016-08-15
#> 3: 1 b 2010-01-01 2010-12-31 x 2016-08-15
#> 4: 1 b 2011-01-01 2011-12-31 x 2016-08-15
#> 5: 1 b 2012-01-01 2012-12-31 x 2016-08-15
#> 6: 1 a 2012-01-01 2012-12-31 x 2016-08-15
#> 7: 1 a 2013-01-01 2013-02-14 x 2016-08-15
#> 8: 1 a 2013-02-15 2013-05-31 x 2016-08-15
#> 9: 1 a 2013-06-01 2013-12-31 y 2016-08-15
#> 10: 1 a 2014-01-01 2014-12-31 x 2016-08-15
#> 11: 1 a 2015-01-01 2015-12-31 x 2016-08-15
#> 12: 1 a 2016-01-01 2016-08-14 x 2016-08-15
#> 13: 1 a 2016-08-15 2016-12-31 y 2016-08-15
#> 14: 1 a 2017-01-01 2017-12-31 x 2016-08-15
#> 15: 1 a 2018-01-01 2018-12-31 x 2016-08-15
#> 16: 1 a 2019-01-01 9999-12-31 x 2016-08-15
#> 17: 2 a 2009-01-01 2009-12-31 x 2013-07-15
#> 18: 2 a 2010-01-01 2010-12-31 x 2013-07-15
#> 19: 2 a 2011-01-01 2011-01-14 x 2013-07-15
#> 20: 2 a 2011-01-15 2011-12-31 y 2013-07-15
#> 21: 2 a 2012-01-01 2012-12-31 x 2013-07-15
#> 22: 2 a 2013-01-01 2013-07-14 x 2013-07-15
#> 23: 2 a 2013-07-15 2013-12-31 y 2013-07-15
#> 24: 2 a 2014-01-01 2014-12-31 x 2013-07-15
#> 25: 2 a 2015-01-01 2015-12-31 x 2013-07-15
#> id group start end reason prom
Примечание: если даты в столбце start
еще не упорядочены (как в примере набора данных), мы можем использовать вместо:
setDT(b)[, start := as.Date(start)][order(start), prom := last(start[reason == "y"]), by = "id"]
Данные
b <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L),
group = c("a", "a", "b", "b", "b", "a", "a", "a", "a", "a",
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
"a", "a", "a"), start = c("2009-01-01", "2010-01-01", "2010-01-01",
"2011-01-01", "2012-01-01", "2012-01-01", "2013-01-01", "2013-02-15",
"2013-06-01", "2014-01-01", "2015-01-01", "2016-01-01", "2016-08-15",
"2017-01-01", "2018-01-01", "2019-01-01", "2009-01-01", "2010-01-01",
"2011-01-01", "2011-01-15", "2012-01-01", "2013-01-01", "2013-07-15",
"2014-01-01", "2015-01-01"), end = c("2009-12-31", "2010-12-31",
"2010-12-31", "2011-12-31", "2012-12-31", "2012-12-31", "2013-02-14",
"2013-05-31", "2013-12-31", "2014-12-31", "2015-12-31", "2016-08-14",
"2016-12-31", "2017-12-31", "2018-12-31", "9999-12-31", "2009-12-31",
"2010-12-31", "2011-01-14", "2011-12-31", "2012-12-31", "2013-07-14",
"2013-12-31", "2014-12-31", "2015-12-31"), reason = c("x",
"x", "x", "x", "x", "x", "x", "x", "y", "x", "x", "x", "y",
"x", "x", "x", "x", "x", "x", "y", "x", "x", "y", "x", "x"
)), row.names = c(NA, -25L), class = "data.frame")