Если происходит событие 1, как часто одновременно происходят событие 2 И событие 3? - PullRequest
1 голос
/ 07 августа 2020

У меня система отопления с тремя терморегуляторами. Если мой первый термостат становится слишком горячим, он может привести к тому, что мой второй станет слишком горячим (хотя therm 2 может стать слишком горячим из других источников), если мой второй станет слишком горячим, он может привести к тому, что мой третий станет слишком горячим. Я хотел бы знать ... если мой первый термостат становится слишком горячим (записывается как Event с date_start и date_end), как часто события на моем втором И третьем термостате происходят одновременно (что я Я бы назвал событие тройного удара)?

Я бы определил событие тройного удара как таковое ... date_start из Temp2 И Temp3 должно произойти между date_start и date_end Темп1.

> df1$Therm1
    date_start  date_end    Event Site
1   2002-04-12  2002-04-21  1     Therm1
2   2002-06-26  2002-07-05  2     Therm1
3   2002-08-15  2002-08-20  3     Therm1
4   2005-08-08  2005-08-19  4     Therm1
> df2$Therm2
    date_start  date_end    Event Site
1   2002-04-13  2002-04-19  1     Therm2
2   2002-08-11  2002-08-19  2     Therm2
3   2005-06-09  2005-06-14  3     Therm2
4   2005-08-10  2005-08-14  4     Therm2
> df3$Therm3
    date_start  date_end    Event Site
1   2002-04-14  2002-04-19  1     Therm3
2   2002-08-11  2002-08-19  2     Therm3
3   2005-06-09  2005-06-14  3     Therm3
4   2005-08-10  2005-08-14  4     Therm3

В этом примере тройной удар происходит во время 1 и 4 Event из df1$Therm1, потому что date_start в df2$Therm2 И df3$Therm3 происходит между date_start и date_end событий в df1$Therm1.

1 Ответ

1 голос
/ 07 августа 2020

Один из способов сделать это - использовать функции lubridate interval и %within%. Они довольно четко названы; interval создает период времени, а %within% проверяет, находится ли предоставленная точка времени в пределах этого интервала.

Предполагается, что df1...df3 - это фактические фреймы данных, а не списки фреймов данных, как они кажутся в вопросе , мы сначала добавляем переменную interval к df1, который является нашим опорным интервалом. Нам также нужно преобразовать start даты df2 и df3 в date объекты с помощью ymd:

library(lubridate)
library(dplyr)
df1 <- df1 %>%
  mutate(interval = interval(
      start = start, end = end))

df2 <- df2 %>% 
    mutate(start = ymd(start))

df3 <- df3 %>%
    mutate(start = ymd(start))

Тогда это может быть так же просто, как поиск start раз из df2 и df3, которые находятся в пределах df1$interval:

df1$event[which(df2$start %within% df1$interval & df3$start %within% df1$interval)]
# [1] 1 4

Предполагается, что на каждом термостате существует постоянное количество событий (т. е. в соответствии с данными вашего примера), но я не Не думаю, что ты действительно этого хочешь. Я думаю, что более надежным подходом было бы проверить, есть ли в конкретном интервале start даты из df2 и df3, например,

df1 %>% 
    rowwise() %>%
    mutate(tripleWhammy =
        any(df2$start %within% interval) &
        any(df3$start %within% interval))

## A tibble: 4 x 6
## Rowwise: 
#  start     end       event site  interval                       #tripleWhammy
#  <chr>     <chr>     <dbl> <chr> <Interval>                     <lgl>       
#1 2002-04-… 2002-04-…     1 Ther… 2002-04-12 UTC--2002-04-21 UTC TRUE        
#2 2002-06-… 2002-07-…     2 Ther… 2002-06-26 UTC--2002-07-05 UTC FALSE       
#3 2002-08-… 2002-08-…     3 Ther… 2002-08-15 UTC--2002-08-20 UTC FALSE       
#4 2005-08-… 2005-08-…     4 Ther… 2005-08-08 UTC--2005-08-19 UTC TRUE 

Data:

df1 <- data.frame(
      start = c('2002-04-12', '2002-06-26', '2002-08-15', '2005-08-08'),
      end = c('2002-04-21', '2002-07-05', '2002-08-20', '2005-08-19'),
      event = c(1,2,3,4),
      site = 'Therm1')

df2 <- data.frame(
    start = c('2002-04-13', '2002-08-11', '2005-06-09', '2005-08-10'),
    end = c('2002-04-19', '2002-08-19', '2005-06-14', '2005-08-14'),
    event = c(1,2,3,4),
    site = 'Therm2')

df3 <- data.frame(
    start = c('2002-04-14', '2002-08-11', '2005-06-09', '2005-08-10'),
    end = c('2002-04-19', '2002-08-19', '2005-06-14', '2005-08-14'),
    event = c(1,2,3,4),
    site = 'Therm3')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...