r-如果事件1发生,事件2和事件3同时发生的频率是多少



我有一个带三个恒温器的供暖系统。如果我的第一个恒温器过热,可能会导致我的第二个恒温器过热(尽管其他来源的therm 2可能会过热(,如果我的第三个恒温器过热可能导致第三个温度过高。我想知道的是……如果我的第一个恒温器过热(记录为带有date_startdate_endEvent(,我的第二个和第三个恒温器中的事件多久会同时发生一次(我称之为三重打击事件(?

我会把三重打击事件定义为。。。Temp2ANDTemp3date_start必须发生在Temp1的date_startdate_end之间。

> 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

在本例中,在df1$Therm114Event期间发生三重打击事件,因为df2$Therm2anddf3$Therm3中的date_start发生在df1$Therm1中的事件的date_startdate_end之间。

实现这一点的一种方法是使用lubridate函数interval%within%。它们的名字很清楚;CCD_ 21创建一个时间段,并且CCD_。

假设df1...df3是实际的数据帧,而不是问题中的数据帧列表,我们首先向df1添加一个interval变量,这是我们的参考区间。我们还需要使用ymd:将df2df3start日期转换为date对象

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))

则可以简单地从df1$interval:内的df2df3中查找start

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

这假设每个恒温器中有恒定数量的事件(即,与您的示例数据一致(,但我不认为这是您真正想要的。我认为更稳健的方法是检查特定区间内是否有df2df3start日期,例如

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 

数据:

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')

最新更新