我有一个带三个恒温器的供暖系统。如果我的第一个恒温器过热,可能会导致我的第二个恒温器过热(尽管其他来源的therm 2可能会过热(,如果我的第三个恒温器过热可能导致第三个温度过高。我想知道的是……如果我的第一个恒温器过热(记录为带有date_start
和date_end
的Event
(,我的第二个和第三个恒温器中的事件多久会同时发生一次(我称之为三重打击事件(?
我会把三重打击事件定义为。。。Temp2
ANDTemp3
的date_start
必须发生在Temp1的date_start
和date_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$Therm1
的1
和4
Event
期间发生三重打击事件,因为df2$Therm2
anddf3$Therm3
中的date_start
发生在df1$Therm1
中的事件的date_start
和date_end
之间。
实现这一点的一种方法是使用lubridate函数interval
和%within%
。它们的名字很清楚;CCD_ 21创建一个时间段,并且CCD_。
假设df1...df3
是实际的数据帧,而不是问题中的数据帧列表,我们首先向df1
添加一个interval
变量,这是我们的参考区间。我们还需要使用ymd
:将df2
和df3
的start
日期转换为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
:内的df2
和df3
中查找start
次
df1$event[which(df2$start %within% df1$interval & df3$start %within% df1$interval)]
# [1] 1 4
这假设每个恒温器中有恒定数量的事件(即,与您的示例数据一致(,但我不认为这是您真正想要的。我认为更稳健的方法是检查特定区间内是否有df2
和df3
的start
日期,例如
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')