Кластеризация данных по датам рассмотрения дела

У меня есть набор данных из 20000 индивидуальных случаев, каждый с датой начала заболевания («дата начала»). Каждый больной проживает в групповом доме, и я хочу сгруппировать случаи по дате начала заболевания в доме.

Итак, я хочу идентифицировать первый случай, который появился в доме. Если в течение 14 дней после первого появятся другие дела, я хочу добавить их в тот же кластер. Если в течение 14 дней появился другой случай из любого другого случая в кластере, я хочу добавить его в тот же кластер. Я бы прекратил добавлять дела в кластер, как только другой случай будет более чем через 14 дней после последнего; в этот момент образуется новый кластер, и процесс перезапускается, пока все не будут отсортированы. «Дата начала» кластера будет датой начала заболевания для первого случая, добавленного в кластер, а конечной датой будет 14 дней после того, как последний случай был добавлен в кластер.

Вот фиктивные данные:

dummy <- data.frame(case = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19), 
                onsetdate  = as.Date(c("2012-08-30", "2012-09-03", "2012-09-09", "2012-09-17", "2012-11-01", "2012-11-05", "2012-11-30", "2012-08-30", "2012-09-03", "2012-10-09", "2012-10-17", "2012-10-30", "2020-12-26", "2020-12-23", "2020-12-30", "2020-12-25", "2021-04-22", "2021-05-03", "2021-05-10")),
                position = c("Resident", "Staff", "Resident", "Staff", "Staff", "Resident", "Resident", "Staff", "Resident", "Staff", "Staff", "Resident", "Resident", "Resident", "Staff", "Resident", "Staff", "Staff", "Resident") , 
                grouphome = c("Group Home 1", "Group Home 1","Group Home 1","Group Home 1","Group Home 1","Group Home 1","Group Home 1","Group Home 1","Group Home 2","Group Home 2","Group Home 2","Group Home 2", "Group Home 3", "Group Home 3","Group Home 3","Group Home 3","Group Home 3","Group Home 3","Group Home 3")
                )

И результат будет выглядеть так:

result <- data.frame(grouphome  = c("Group Home 1", "Group Home 1","Group Home 1","Group Home 2","Group Home 2", "Group Home 3", "Group Home 3"), 
                 clusterNumber = c("1", "2", "3", "1", "2", "1", "2"), 
                 clusterStart = as.Date(c("2012-08-30", "2012-11-01", "2012-11-30", "2012-09-03", "2012-10-09", "2020-12-23", "2021-04-22")),
                 cases = c("5", "2", "1", "1", "3", "4", "3"))

Огромное спасибо заранее


person mobo1    schedule 21.05.2021    source источник


Ответы (1)


Похоже, вы сначала хотите group_by grouphome.

Вы также можете group_by clusterNumber, который можно определить, глядя на различия в onsetdate, которые превышают 14 дней. Использование cumsum или кумулятивной суммы обеспечит счетчик для этого.

Последний summarise примет первую дату clusterStart в домашнем кластере группы, а cases будет числом строк для этого кластера.

Это предполагает, что даты уже отсортированы в хронологическом порядке. Если это не так, вам сначала нужно arrange.

Изменить: чтобы добавить два столбца для общего количества резидентов и сотрудников для каждого clusterNumber, вы можете sum position для каждого из этих двух случаев.

library(dplyr)

dummy %>%
  group_by(grouphome) %>%
  group_by(clusterNumber = 1 + cumsum(c(0, diff(onsetdate) > 14)), .add = TRUE) %>%
  summarise(clusterStart = first(onsetdate),
            cases = n(),
            resident = sum(position == "Resident"),
            staff = sum(position == "Staff"))

Вывод

  grouphome    clusterNumber clusterStart cases resident staff
  <chr>                <dbl> <date>       <int>    <int> <int>
1 Group Home 1             1 2012-08-30       4        2     2
2 Group Home 1             2 2012-11-01       2        1     1
3 Group Home 1             3 2012-11-30       2        1     1
4 Group Home 2             1 2012-09-03       1        1     0
5 Group Home 2             2 2012-10-09       3        1     2
person Ben    schedule 21.05.2021
comment
Большое спасибо за ответ! Когда я применил это к своим данным, это выглядело так, как будто кластеризовались только те, которые были в одном доме и имели точно такую ​​же дату начала. Когда я попытался преобразовать свою переменную onsetdate в формат даты, она начала выдавать мне ошибку после строки: group_by (clusterNumber = 1 + cumsum (c (0, diff (onsetdate) ›14)), .add = TRUE) ошибка: Ошибка: проблема с добавлением вычисляемых столбцов в group_by(). x Проблема с mutate() входом clusterNumber. x нечисловой аргумент бинарного оператора - person mobo1; 22.05.2021
comment
Да ладно, я неправильно конвертировал в формат даты. Теперь это сработало, большое вам спасибо !!! - person mobo1; 22.05.2021
comment
Быстрый вопрос @ Бен, не могли бы вы посоветовать, как мне добавить разные столбцы для сотрудников и резидентов для каждого кластера? - person mobo1; 22.05.2021
comment
да! Ты лучший, спасибо тебе огромное! - person mobo1; 25.05.2021
comment
Спасибо! Думаю, мне нужно отредактировать его еще раз, чтобы получить более четкое изображение .. Я отвечу здесь, когда он будет готов. Думаю, проблема больше в том, как я «аранжирую» - person mobo1; 26.05.2021
comment
Собственно, это могло решить ее! Я думаю, что мне нужно было организовать (групповой дом, дата начала) с самого начала, чтобы они правильно сгруппировались, как вы упомянули в своем первом ответе! - person mobo1; 26.05.2021