【问题标题】:R dplyr join on range of datesR dplyr 加入日期范围
【发布时间】:2019-01-24 17:31:43
【问题描述】:

我想使用复合唯一键和日期范围连接两个表 xxxyyy。在 sql 中,我只需在连接中指定,但我无法让 dplyr 工作。这可能吗?

test<- inner_join(xxx, yyy, by = c("ID" = "ID",
                               "NRA"="NRA",
                               "date_low">"date",
                               "date_high"<"date"),
                               copy = FALSE)

【问题讨论】:

  • 能否提供输入数据和预期输出?
  • 使用fuzzy_join,然后使用matches = c('=', '=', "&gt;", "&lt;")
  • @user1357015 我不能。实际数据受到限制。示例数据很难构建。 xxx.date_low 几乎总是低于yyy.date,而yyy.date 几乎总是高于xxx.date_high。这是我追求的功能。
  • 如果你不能分享这个exact数据集,你可以找一个复制问题的常用数据集,或者弥补一些数据。没有reproducible example,除了猜测如何解决问题之外,很难做更多的事情

标签: r dplyr


【解决方案1】:

我们可以使用fuzzy_join中的fuzzy_inner_join

library(fuzzy_join)
fuzzy_inner_join(xxx, yyy,
              by = c("ID" = "ID",
                           "NRA"="NRA",
                           "date_low" =  "date",
                           "date_high" = "date"), 
              match_fun = list("==", "==", ">", "<"))

【讨论】:

  • 谢谢阿克伦。我就是这样做的,我得到了这个错误stackoverflow.com/questions/44383510/…
  • @J.Doe。没有可重现的例子,这很困难。代码是标准语法
  • @akrun 似乎有些人发现在 match_fun 列表中使用反引号而不是引号会使其工作。
【解决方案2】:

首先,感谢您尝试帮助我。我意识到我的问题不完整。由于所有bioconductor 的依赖关系,我离开了fuzzyjoin

我改用sqldf 来完成任务:

library(sqldf)
sqldf("SELECT * FROM xxx
            LEFT JOIN yyy
            ON  xxx.ID  = yyy.ID
            AND xxx.NRA = yyy.NRA
            AND yyy.date BETWEEN xxx.date_low AND xxx.date_high")

结果几乎与 question 相同,但我怀疑它也可以按照 Uwe 的 data.table 解决方案使用 question 解决。

我也在链接这个rstudio response

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 2017-04-27
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多