6
4

1 回答 1

8

澄清术语:

解决您的问题的data.table方法不需要与 data.table 进行模糊连接[至少在不精确匹配的意义上]。相反,您只想使用不相等的二元运算符>=><=/或加入 data.table 列<。在data.table术语中,这些被称为“非等值连接”。

您将问题命名为“使用 data.table 模糊连接两个数据帧”,这是可以理解的,这是您在第一次工作尝试中使用 library(fuzzyjoin) 之后。(没问题,只是为读者澄清。)

使用data.table非 equi 连接来比较日期列的解决方案:

您非常接近一个可行的data.table解决方案:

dt_final_data <- setDT(df2)[df1, 
                            on = .(ID, date > start_date, date <= end_date)]

要修改它以使其按您的意愿工作,只需添加一个 data.tablej表达式以选择您想要的列,按照您希望它们的顺序编辑:并在问题列前面加上x.(告诉 data.table 从连接的x一侧dt_x[dt_i,]例如,如下调用列x.date

dt_final_data <- setDT(df2)[df1, 
                            .(ID, f_date, ACCNUM, flmNUM, start_date, end_date, x.date, fyear, at, lt), 
                            on = .(ID, date > start_date, date <= end_date)]

现在,这将为您提供您所追求的输出:

dt_final_data
         ID     f_date               ACCNUM    flmNUM start_date   end_date     x.date fyear         at         lt
 1:   50341 2002-03-08 0001104659-02-000656   2571187 2002-09-07 2003-08-30 2002-12-31  2002 190453.000 173620.000
 2: 1067983 2009-11-25 0001047469-09-010426  91207220 2010-05-27 2011-05-19 2010-12-31  2010 372229.000 209295.000
 3:  804753 2004-05-14 0001193125-04-088404   4805453 2004-11-13 2005-11-05 2004-12-31  2004    982.265    383.614
 4: 1090727 2013-05-22 0000712515-13-000022  13865105 2013-11-21 2014-11-13 2013-12-31  2013  36212.000  29724.000
 5: 1467858 2010-02-26 0001193125-10-043035  10640035 2010-08-28 2011-08-20 2010-12-31  2010 138898.000 101739.000
 6:  858877 2019-01-31 0001166691-19-000005  19556540 2019-08-02 2020-07-24       <NA>    NA         NA         NA
 7:    2488 2016-02-24 0001193125-16-476010 161452982 2016-08-25 2017-08-17 2016-12-31  2016   3321.000   2905.000
 8: 1478242 2004-03-12 0001193125-04-039482   4664082 2004-09-11 2005-09-03       <NA>    NA         NA         NA
 9: 1467858 2017-02-16 0001555280-17-000044  17618235 2017-08-18 2018-08-10 2017-12-31  2017 212482.000 176282.000
10:   14693 2015-10-28 0001193125-15-356351 151180619 2016-04-28 2017-04-20 2016-04-30  2015   4183.000   2621.000

如上所述,ID=50341 的结果现在具有 date=2002-12-31。换句话说,结果列date现在来自df2.date.

您当然可以在 j 表达式中重命名 x.date 列:

setDT(df2)[ df1, 
            .(ID, 
              f_date, 
              ACCNUM, 
              flmNUM, 
              start_date, 
              end_date, 
              my_result_date_name = x.date, 
              fyear, 
              at, 
              lt), 
            on = .(ID, date > start_date, date <= end_date)]

为什么 data.table (当前)重命名非 equi 连接中的列并从不同的列返回数据:

@ScottRitchie 的解释很好地总结了它:

执行任何连接时,结果中只返回每个键列的一个副本。目前,i 中的列被返回,并用 x 中的列名标记,使 equi 连接与基本 merge() 的行为一致。

如果您记得在 1.9.8 版本之前 data.table 没有非 equi 连接,那么上面是有道理的。

通过并包括当前 1.12.2 版本的 data.table,这个(以及几个重叠的问题)已经成为 data.table github 问题列表上大量讨论的来源。例如: 非等连接中可能存在的不一致,返回连接列 #3437以及 非等连接和滚动连接的类似 SQL 的列返回 #2706只是其中的两个。

但是,请观看此 github 问题: 从上述讨论继续,data.table 团队的敏锐分析头脑正在努力在某些(希望不会太远)未来版本中减少混淆: 滚动和非 equi 连接的两个列# 3093

于 2019-04-10T11:23:08.373 回答