假设我有df1:
Start_Date End_Date Value
2001-01-01 2001-12-31 1
2002-01-01 2002-12-31 2
2003-01-01 2003-12-31 3
2004-01-01 2004-12-31 4
2005-01-01 2005-12-31 5
&df2:
DateTime
2003-01-01
2003-05-09
2004-12-31
2005-01-31
2005-08-13
我想通过检查df2中的哪个DateTime介于df1的Start_Date和End_Date之间,将值从df1导入df2。预期结果的观点:
DateTime Value
2003-01-01 3
2003-05-09 3
2004-12-31 4
2005-01-31 5
2005-08-13 5
请告知
使用dplyr
和lubridate
给出解决方案。
开始之前,请确保所有日期的格式都相同:
df1 <- df1 %>%
mutate(Start_Date=ymd(Start_Date), End_Date=dmy(End_Date))
df2 <- df2 %>%
mutate(DateTime=ymd(DateTime))
在您的情况下,只需要列End_Date
。
首先我交叉连接两个data.frame,因为我看不到将两个df组合在一起的简单解决方案。
df3 <- merge(df1, df2, all=TRUE)
下一步使用filter
和between
df3 %>%
filter(between(DateTime, Start_Date, End_Date)) %>%
select(-c(Start_Date, End_Date))
给予
Value DateTime
1 3 2003-01-01
2 3 2003-05-09
3 4 2004-12-31
4 5 2005-01-31
5 5 2005-08-13
data.table
的另一个选项setDT(df1)
setDT(df2)
df1[df2, on = .(Start_Date <= DateTime, End_Date >= DateTime),
.(DateTime, Value)]
产量
DateTime Value
1: 2003-01-01 3
2: 2003-05-09 3
3: 2004-12-31 4
4: 2005-01-31 5
5: 2005-08-13 5
附加选项。使用lubridate
,您可以查看日期是什么间隔
library(tidyverse)
df2 %>%
rowwise() %>%
mutate(out = df1$Value[(DateTime %within% interval(df1$Start_Date, df1$End_Date))])