Один из способов сделать это - использовать функции lubridate interval
и %within%
. Они довольно четко названы; interval
создает период времени, а %within%
проверяет, находится ли предоставленная точка времени в пределах этого интервала.
Предполагается, что df1...df3
- это фактические фреймы данных, а не списки фреймов данных, как они кажутся в вопросе , мы сначала добавляем переменную interval
к df1
, который является нашим опорным интервалом. Нам также нужно преобразовать start
даты df2
и df3
в 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))
Тогда это может быть так же просто, как поиск start
раз из df2
и df3
, которые находятся в пределах df1$interval
:
df1$event[which(df2$start %within% df1$interval & df3$start %within% df1$interval)]
# [1] 1 4
Предполагается, что на каждом термостате существует постоянное количество событий (т. е. в соответствии с данными вашего примера), но я не Не думаю, что ты действительно этого хочешь. Я думаю, что более надежным подходом было бы проверить, есть ли в конкретном интервале start
даты из df2
и df3
, например,
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
Data:
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')