使用子集在 dplyr 中进行条件左连接

Conditional Left Join in dplyr using subset

我正在尝试使用 dplyr 在两个数据帧之间执行条件左连接。我的第一个数据框 df1:

ID  Start Date End Date
1   1-1-2000   4-1-2020

我的第二个数据框,df2:

ID START_DT END_DT   Name
1  2-3-2002 3-1-2020 John Smith
1  4-2-2004 4-1-2021 Karen Anderson

我正在尝试加入开始日期 > START_DT 和结束日期 <= END_DT

的 ID
ID START_DT END_DT   Name        Start Date  End Date
1  2-3-2002 3-1-2020 John Smith  1-1-2000    4-1-2020

我已经试过了,但出现错误

new_df <- left_join(df2, df1, by = "ID") %>%
  subset(subset(new_df, `Start Date` > START_DT & `End Date` <= END_DT))

我也试过只做连接然后子集,这给了我

Warning messages:
1: In eval(e, x, parent.frame()) :
  Incompatible methods (">.POSIXt", "Ops.factor") for ">"
2: In eval(e, x, parent.frame()) :
  Incompatible methods ("<=.POSIXt", "Ops.factor") for "<="

据我所知,您的代码存在三个问题:您使用了 subset() 两次,在 dplyr 管道中引用了 new_df,这是不必要的并且会导致问题,并且您的日期不是 R 的默认格式。

下面的代码应该对您有用,并希望能澄清您的错误所在。

new_df <- left_join(df2, df1, by = "ID") %>%
  subset(as.Date(Start Date, "%m-%d-%Y") > as.Date(START_DT, "%m-%d-%Y") & as.Date(End Date, "%m-%d-%Y") <= as.Date(END_DT, "%m-%d-%Y"))

另一种选择是使用 filter():

new_df <- left_join(df2, df1, by = "ID") %>%
  filter(as.Date(Start Date, "%m-%d-%Y") > as.Date(START_DT, "%m-%d-%Y") & as.Date(End Date, "%m-%d-%Y") <= as.Date(END_DT, "%m-%d-%Y"))

希望对您有所帮助!