Я хочу сгруппировать внутри группы по разнице дат.
Например, если в учреждении А 7 случаев, но первые 5 случаев произошли до 14 дней последних 2 случаев, я хочу, чтобы они были в двух разных группах (см. пример ниже).
| место нахождения | адрес | Дата начала | start_date_diff | Группа |
|---|---|---|---|---|
| Объект А | 123 главная улица | 07.02.2022 | 0 | 1 |
| Объект А | 123 главная улица | 11.02.2022 | 4 | 1 |
| Объект А | 123 главная улица | 11.02.2022 | 0 | 1 |
| Объект А | 123 главная улица | 11.02.2022 | 0 | 1 |
| Объект А | 123 главная улица | 12.02.2022 | 1 | 1 |
| Объект А | 123 главная улица | 12.03.2022 | 28 | 2 |
| Объект А | 123 главная улица | 17.03.2022 | 5 | 2 |
| Объект Б | 55 форд рд | 16.03.2022 | 0 | 3 |
| Объект Б | 55 форд рд | 16.03.2022 | 0 | 3 |
| Объект С | 1 шаг пр. | 16.03.2022 | 0 | 4 |
| Объект С | 1 шаг пр. | 20.03.2022 | 4 | 4 |
| Объект С | 1 шаг пр. | 22.03.2022 | 2 | 4 |
вот мой код до сих пор:
Я застрял в том, как сгруппировать их дальше по разнице дат между отдельными наблюдениями.





Предполагая, что мы еще не вычислили diff и что нам нужно преобразовать start_date во что-то арифметически полезное.
library(data.table)
as.data.table(dat)[, start_date := as.Date(start_date, format = "%m/%d/%Y")
][, diff14 := cumsum(c(0, diff(start_date)) > 14), by = location
][, Group2 := rleid(location, diff14)][]
# location address start_date start_date_diff Group diff14 Group2
# <char> <char> <Date> <int> <int> <int> <int>
# 1: Facility A 123 main st 2022-02-07 0 1 0 1
# 2: Facility A 123 main st 2022-02-11 4 1 0 1
# 3: Facility A 123 main st 2022-02-11 0 1 0 1
# 4: Facility A 123 main st 2022-02-11 0 1 0 1
# 5: Facility A 123 main st 2022-02-12 1 1 0 1
# 6: Facility A 123 main st 2022-03-12 28 2 1 2
# 7: Facility A 123 main st 2022-03-17 5 2 1 2
# 8: Facility B 55 ford rd 2022-03-16 0 3 0 3
# 9: Facility B 55 ford rd 2022-03-16 0 3 0 3
# 10: Facility C 1 step ave 2022-03-16 0 4 0 4
# 11: Facility C 1 step ave 2022-03-20 4 4 0 4
# 12: Facility C 1 step ave 2022-03-22 2 4 0 4
library(dplyr)
dat %>%
mutate(start_date = as.Date(start_date, format = "%m/%d/%Y")) %>%
group_by(location) %>%
mutate(diff14 = cumsum(c(0, diff(start_date)) > 14)) %>%
group_by(location, diff14) %>%
mutate(Group2 = cur_group_id()) %>%
ungroup()
# # A tibble: 12 x 7
# location address start_date start_date_diff Group diff14 Group2
# <chr> <chr> <date> <int> <int> <int> <int>
# 1 Facility A 123 main st 2022-02-07 0 1 0 1
# 2 Facility A 123 main st 2022-02-11 4 1 0 1
# 3 Facility A 123 main st 2022-02-11 0 1 0 1
# 4 Facility A 123 main st 2022-02-11 0 1 0 1
# 5 Facility A 123 main st 2022-02-12 1 1 0 1
# 6 Facility A 123 main st 2022-03-12 28 2 1 2
# 7 Facility A 123 main st 2022-03-17 5 2 1 2
# 8 Facility B 55 ford rd 2022-03-16 0 3 0 3
# 9 Facility B 55 ford rd 2022-03-16 0 3 0 3
# 10 Facility C 1 step ave 2022-03-16 0 4 0 4
# 11 Facility C 1 step ave 2022-03-20 4 4 0 4
# 12 Facility C 1 step ave 2022-03-22 2 4 0 4
Данные
read.md <- structure(list(location = c("Facility A", "Facility A", "Facility A", "Facility A", "Facility A", "Facility A", "Facility A", "Facility B", "Facility B", "Facility C", "Facility C", "Facility C"), address = c("123 main st", "123 main st", "123 main st", "123 main st", "123 main st", "123 main st", "123 main st", "55 ford rd", "55 ford rd", "1 step ave", "1 step ave", "1 step ave"), start_date = c("2/7/2022", "2/11/2022", "2/11/2022", "2/11/2022", "2/12/2022", "3/12/2022", "3/17/2022", "3/16/2022", "3/16/2022", "3/16/2022", "3/20/2022", "3/22/2022"), start_date_diff = c(0L, 4L, 0L, 0L, 1L, 28L, 5L, 0L, 0L, 0L, 4L, 2L), Group = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 4L)), class = "data.frame", row.names = c(NA, -12L))
Это код, который у меня есть на данный момент: