【问题标题】:Conditional Left Join in dplyr using subset使用子集在 dplyr 中进行条件左连接
【发布时间】:2020-06-03 16:11:10
【问题描述】:

我正在尝试使用 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

我正在尝试加入 ID,其中开始日期 > START_DT AND 结束日期

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

标签: r dplyr left-join conditional-operator


【解决方案1】:

据我所知,您的代码存在三个问题:您使用了两次 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"))

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多