Это должно сделать это.Обратите внимание, что если в одной из групп будет менее трех строк, вы получите сообщение об ошибке.
dd <- tibble::tribble(
~ID, ~Time, ~Value,
'i1', as.Date('2018-01-01'), 1.1,
'i1', as.Date('2018-02-01'), 2.1,
'i1', as.Date('2018-03-01'), 3.1,
'i1', as.Date('2018-04-01'), -1,
'i2', as.Date('2018-01-01'), 10,
'i2', as.Date('2018-02-01'), 20,
'i2', as.Date('2018-03-01'), -40
)
library(dplyr)
dd %>%
group_by(ID) %>%
arrange(Time, .by_group = TRUE) %>%
mutate(`3pt-min` = zoo::rollapply(Value, 3, min, fill = NA, align = "right"))
# A tibble: 7 x 4
# Groups: ID [2]
ID Time Value `3pt-min`
<chr> <date> <dbl> <dbl>
1 i1 2018-01-01 1.1 NA
2 i1 2018-02-01 2.1 NA
3 i1 2018-03-01 3.1 1.1
4 i1 2018-04-01 -1 -1
5 i2 2018-01-01 10 NA
6 i2 2018-02-01 20 NA
7 i2 2018-03-01 -40 -40