R 如果事件1发生,那么事件2和事件3多久同时发生一次?
我有一个带三个恒温器的供暖系统。如果我的第一个恒温器太热,它可能导致我的第二个恒温器太热(尽管therm 2可能从其他来源太热),如果我的第二个恒温器太热,它可能导致我的第三个恒温器太热。我想知道的是…如果我的第一个恒温器太热(记录为R 如果事件1发生,那么事件2和事件3多久同时发生一次?,r,dataframe,date,R,Dataframe,Date,我有一个带三个恒温器的供暖系统。如果我的第一个恒温器太热,它可能导致我的第二个恒温器太热(尽管therm 2可能从其他来源太热),如果我的第二个恒温器太热,它可能导致我的第三个恒温器太热。我想知道的是…如果我的第一个恒温器太热(记录为事件,带有开始日期和结束日期),我的第二个和第三个恒温器中的事件多久会同时发生一次(我称之为三重打击事件) 我将定义一个三重打击事件,例如,Temp2的date\u start和Temp3必须发生在Temp1的date\u start和date\u end之间 &g
事件
,带有开始日期
和结束日期
),我的第二个和第三个恒温器中的事件多久会同时发生一次(我称之为三重打击事件)
我将定义一个三重打击事件,例如,Temp2的date\u start
和Temp3
必须发生在Temp1的date\u start
和date\u 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
在此示例中,在df1$Therm1
的1
和4
事件期间发生三重打击事件,因为df2$Therm2
中的date\u start
和df3$Therm3
发生在df1$Therm1
一种方法是在%
内使用润滑油功能interval
和%。他们的名字很清楚<代码>间隔
创建一个时间段,%内%
检查提供的时间点是否在该时间段内
假设df1…df3
是实际的数据帧,而不是问题中的数据帧列表,我们首先向df1
添加一个interval
变量,这是我们的参考间隔。我们还需要将df2
和df3
的start
日期转换为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))
这假设每个恒温器上都有恒定数量的事件(即,与示例数据一致),但我认为这不是您真正想要的。我认为一种更可靠的方法是从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%>%
行()
突变(三重打击)=
任何(df2$start%在%间隔内)&
任何(df3$start%在%间隔内))
##一个tibble:4x6
##顺时针:
#开始-结束事件站点间隔#三重打击
#
#1 2002-04-…2002-04-…1其他…2002-04-12 UTC--2002-04-21 UTC正确
#2 2002-06-…2002-07-…2其他…2002-06-26 UTC--2002-07-05 UTC错误
#3 2002-08-…2002-08-…3其他…2002-08-15 UTC--2002-08-20 UTC错误
#4 2005-08-…2005-08-…4其他…2005-08-08 UTC--2005-08-19 UTC正确
数据:
df1@Ronak Shah这里是以另一种方式提出的问题。
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$event[which(df2$start %within% df1$interval & df3$start %within% df1$interval)]
# [1] 1 4
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')