Групиране на данни въз основа на дати на случаи

Имам набор от данни от 20 000 отделни случая, всеки с начална дата на заболяването („дата на начало“). Всеки случай живее в групов дом и искам да групирам случаите въз основа на началната дата на заболяването в дома.

Затова искам да идентифицирам първия случай, който се появи в дома. Ако се появи друг(и) случай(и) в рамките на 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
Бърз въпрос, @Ben, бихте ли ми дали съвет как да добавя различна колона за Персонал срещу Обитател за всеки клъстер? - person mobo1; 22.05.2021
comment
да! Вие сте най-добрият, благодаря ви много! - person mobo1; 25.05.2021
comment
Благодаря ти! Мисля, че трябва да го редактирам отново, за да дам по-ясна картина.. Ще отговоря тук, когато е готово. Мисля, че проблемът е по-скоро в това как "подреждам" - person mobo1; 26.05.2021
comment
Всъщност това може да е решило проблема! Мисля, че трябваше да организирам (grouphome, onsetdate) в самото начало, за да могат да се групират правилно, както споменахте в първия си отговор! - person mobo1; 26.05.2021