Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果事件1发生,那么事件2和事件3多久同时发生一次?_R_Dataframe_Date - Fatal编程技术网

R 如果事件1发生,那么事件2和事件3多久同时发生一次?

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

我有一个带三个恒温器的供暖系统。如果我的第一个恒温器太热,它可能导致我的第二个恒温器太热(尽管therm 2可能从其他来源太热),如果我的第二个恒温器太热,它可能导致我的第三个恒温器太热。我想知道的是…如果我的第一个恒温器太热(记录为
事件
,带有
开始日期
结束日期
),我的第二个和第三个恒温器中的事件多久会同时发生一次(我称之为三重打击事件)

我将定义一个三重打击事件,例如,
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')