Lubridate: интервалы, которые перекрывают любые другие по группам - PullRequest
0 голосов
/ 04 декабря 2018

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

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

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

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 для id==1 первый и второй периоды перекрываются, но не совпадают с третьим.Так что для этого идентификатора overlap_any должно быть (True,True,False).

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

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

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

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

1 Ответ

0 голосов
/ 05 декабря 2018

Я сделал

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...