1 回答
澄清术语:
解决您的问题的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