Смазка: интервалы, которые перекрывают любые другие по группе.

Здравствуйте и большое спасибо!

Я пытаюсь определить, какие интервалы перекрываются с другими в группе.

Например, если бы у нас были следующие данные:

id <- rep(1:3, each=3)
hospitalization <- seq(ymd_hms("2017-11-28 00:00:01"), by = "day", length.out = length(id))

dat <- data.frame(id, hospitalization)

dat[3,2] <- dat[3,2] + dhours(12)

library(dplyr)
library(lubridate)

dat %>% 
  mutate(
    discharge = hospitalization + dhours(35),
    interval= hospitalization %--% discharge
  ) -> dat

dat

> dat
  id     hospitalization           discharge                                           interval
1  1 2017-11-28 00:00:01 2017-11-29 11:00:01 2017-11-28 00:00:01 UTC--2017-11-29 11:00:01 UTC
2  1 2017-11-29 00:00:01 2017-11-30 11:00:01 2017-11-29 00:00:01 UTC--2017-11-30 11:00:01 UTC
3  1 2017-11-30 12:00:01 2017-12-01 23:00:01 2017-11-30 12:00:01 UTC--2017-12-01 23:00:01 UTC
4  2 2017-12-01 00:00:01 2017-12-02 11:00:01 2017-12-01 00:00:01 UTC--2017-12-02 11:00:01 UTC
5  2 2017-12-02 00:00:01 2017-12-03 11:00:01 2017-12-02 00:00:01 UTC--2017-12-03 11:00:01 UTC
6  2 2017-12-03 00:00:01 2017-12-04 11:00:01 2017-12-03 00:00:01 UTC--2017-12-04 11:00:01 UTC
7  3 2017-12-04 00:00:01 2017-12-05 11:00:01 2017-12-04 00:00:01 UTC--2017-12-05 11:00:01 UTC
8  3 2017-12-05 00:00:01 2017-12-06 11:00:01 2017-12-05 00:00:01 UTC--2017-12-06 11:00:01 UTC
9  3 2017-12-06 00:00:01 2017-12-07 11:00:01 2017-12-06 00:00:01 UTC--2017-12-07 11:00:01 UTC

dat[1,4]
dat[2,4]
dat[3,4]

int_overlaps(dat[1,4],dat[2,4])
int_overlaps(dat[2,4],dat[3,4])
int_overlaps(dat[1,4],dat[3,4])
int_overlaps(dat[1,4],dat[3,4])

Я хотел бы рассчитать столбец, который является логическим (overlap_any), указывающим, перекрывает ли период какой-либо (не все, но хотя бы один) другой в той же группе.

При группировке по идентификатору для id==1 первый и второй периоды перекрываются, но не совпадают с третьим. Так что для этого идентификатора overlap_any должно быть (True,True,False).

Я думал о чем-то вроде:

dat %>% 
  group_by(id) %>% 
  mutate(
    overlap_any = some_function(interval)
  )

Но я не знаю, что делать, потому что group_by берет все интервалы за группу, а не текущую строку, которую я хотел бы оценить на предмет перекрытия с остальными. Кроме того, int_overlaps принимает только два аргумента.

Я ценю помощь!


person Peter Olejua    schedule 03.12.2018    source источник


Ответы (1)


Я сделал

overlaps_others <- function(y) sapply(y, function(x) sum(int_overlaps(x,y)))-1

dat %>% 
  split(id) %>% 
  lapply(function(z){
    z %>% 
      mutate(
        overlaps = overlaps_others(interval)

      ) %>%
      select(-interval)
  }) %>% 
  bind_rows()
person Peter Olejua    schedule 04.12.2018
comment
Я следовал этому - person Peter Olejua; 05.12.2018