【问题标题】:Left Join with Multiple Criteria具有多个条件的左连接
【发布时间】:2020-05-11 02:56:29
【问题描述】:

我有两个数据,我想用 2 个条件进行左连接。

标准 1:相同的标题

标准 2:StartDate 和 EndDate 之间的日期

数据 B

Title  Date
A      2018-07-01
B      2019-12-30

数据 A

Title StartDate  EndDate     Score
A     2018-01-01 2018-05-18    0
A     2018-05-19 2019-01-01    1
B     2019-10-01 2020-02-01    4
B     2020-02-02 2020-10-01    7

这就是我想要的

Title  Score
A       1
B       4

提前致谢!

【问题讨论】:

    标签: r merge


    【解决方案1】:

    我们可以对data.table使用非等连接

    library(data.table)
    setDT(DataA)[DataB,  .(Title, Score), on = 
          .(Title, StartDate < Date, EndDate >= Date)]
    #   Title Score
    #1:     A     1
    #2:     B     4
    

    数据

    DataA <- structure(list(Title = c("A", "A", "B", "B"), 
    StartDate = structure(c(17532, 
    17670, 18170, 18294), class = "Date"), EndDate = structure(c(17669, 
    17897, 18293, 18536), class = "Date"), Score = c(0L, 1L, 4L, 
    7L)), row.names = c(NA, -4L), class = "data.frame")
    
    DataB <- structure(list(Title = c("A", "B"), Date = structure(c(17713, 
    18260), class = "Date")), row.names = c(NA, -2L), class = "data.frame")
    

    【讨论】:

    • 谢谢!只需再编辑一次。如果我想在我的新数据集中保留 DataB,我应该如何编辑?
    • @SeqenenreTao 你可以做setDT(DataA)[DataB, .(Title, Score, Date = StartDate), on = .(Title, StartDate &lt; Date, EndDate &gt;= Date)]
    • 我对那个解决方案有一些问题。在您使用的公式中:“StartDate = Date)”。当“日期”==“开始日期”时,我得到了 NA。另一方面,我们不能使用“StartDate = Date”来避免重复。我该如何解决这个问题?
    • @SeqenenreTao 如果相等,就用Date = StartDate你可以用StartDate &lt;= Date, EndDate &gt;= Date视情况而定
    猜你喜欢
    • 2014-04-05
    • 2012-01-08
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多