使用子集在 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"))
希望对您有所帮助!
我正在尝试使用 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
的 IDID 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"))
希望对您有所帮助!