Преобразуйте ваш gift_date
в фактический объект даты, тогда было бы легко сделать это по группам и выбрать максимальные и минимальные значения.Использование dplyr
library(dplyr)
df %>%
mutate(gift_date = as.Date(as.character(gift_date), "%Y%m%d")) %>%
group_by(ind_id) %>%
mutate(min = min(gift_date),
max = max(gift_date))
# ind_id gift_id gift_date min max
# <int> <int> <date> <date> <date>
#1 1 1 2019-01-01 2019-01-01 2019-01-04
#2 1 2 2019-01-02 2019-01-01 2019-01-04
#3 1 3 2019-01-03 2019-01-01 2019-01-04
#4 1 4 2019-01-04 2019-01-01 2019-01-04
#5 2 5 2019-02-01 2019-02-01 2019-06-01
#6 2 6 2019-03-19 2019-02-01 2019-06-01
#7 2 7 2019-04-12 2019-02-01 2019-06-01
#8 2 8 2019-05-11 2019-02-01 2019-06-01
#9 2 9 2019-06-01 2019-02-01 2019-06-01
Или использование data.table
может быть более эффективным.
library(data.table)
df$gift_date <- as.Date(as.character(df$gift_date), "%Y%m%d")
setDT(df)[, `:=` (min = min(gift_date), max = max(gift_date)), by = ind_id]
data
df <- structure(list(ind_id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L),
gift_id = 1:9, gift_date = c(20190101L, 20190102L, 20190103L,
20190104L, 20190201L, 20190319L, 20190412L, 20190511L, 20190601L
)), class = "data.frame", row.names = c(NA, -9L))