我有三个数据框(df1
、df2
和df3
(,其开始和结束日期指示事件发生的时间。我知道如何确定df1
与df2
或df3
之间是否发生重叠,但我不知道如何确定所有数据框之间何时发生重叠。理想情况下,如果df2
和df3
在df1
的开始和结束日期内,则将通过一个新列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
此代码确定df1
和df2
或df3
之间是否存在重叠。
df1$aa$Overlap <- df1$aa$date_start %in% unlist(Map(':', df2$aa$date_start, df2$aa$date_end))
理想情况下,上面的代码将能够包含df1
、df2
和df3
之间的重叠。
您可以将数据帧放在列表中。为每个数据帧生成天数序列,并使用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