确定 R 中是否有三个(或更多)给定时间范围重叠



我有三个数据框(df1df2df3(,其开始和结束日期指示事件发生的时间。我知道如何确定df1df2df3之间是否发生重叠,但我不知道如何确定所有数据框之间何时发生重叠。理想情况下,如果df2df3df1的开始和结束日期内,则将通过一个新列Overlap指示,其中包含当所有三个数据框在时间上重叠时TRUE结果,以及当所有三个数据框在时间上不重叠时FALSE结果。

> df1$aa
date_start  date_end    Site  Variable
1   2002-04-12  2002-04-21  aa    Temp1
2   2002-06-26  2002-07-05  aa    Temp1
3   2002-08-15  2002-08-20  aa    Temp1
4   2005-08-08  2005-08-19  aa    Temp1
> df2$bb
date_start  date_end    Site  Variable
1   2002-04-13  2002-04-19  aa    Temp2
2   2002-08-11  2002-08-19  aa    Temp2
3   2005-06-09  2005-06-14  aa    Temp2
4   2005-08-10  2005-08-14  aa    Temp2
> df2$cc
date_start  date_end    Site  Variable
1   2002-04-14  2002-04-19  aa    Temp3
2   2002-08-11  2002-08-19  aa    Temp3
3   2005-06-09  2005-06-14  aa    Temp3
4   2005-08-10  2005-08-14  aa    Temp3

此代码确定df1df2df3之间是否存在重叠。

df1$aa$Overlap <- df1$aa$date_start %in% unlist(Map(':', df2$aa$date_start, df2$aa$date_end))

理想情况下,上面的代码将能够包含df1df2df3之间的重叠。

您可以将数据帧放在列表中。为每个数据帧生成天数序列,并使用intersect查找所有 3 个数据帧中存在的公共日期。然后,如果common_days存在于df1范围内,则可以在df1中添加新列Overlap

list_df <- list(df1, df2, df3)
common_days <- Reduce(intersect, lapply(list_df, function(x) 
unlist(Map(':', x$date_start, x$date_end))))
df1$Overlap <- mapply(function(x, y) any(x:y %in% common_days),
df1$date_start, df1$date_end)
df1
#  date_start   date_end Site Variable Overlap
#1 2002-04-12 2002-04-21   aa    Temp1    TRUE
#2 2002-06-26 2002-07-05   aa    Temp1   FALSE
#3 2002-08-15 2002-08-20   aa    Temp1    TRUE
#4 2005-08-08 2005-08-19   aa    Temp1    TRUE

最新更新