R:使用agrep和data.table进行模糊合并

R:使用agrep和data.table进行模糊合并,r,data.table,agrep,R,Data.table,Agrep,我尝试合并两个data.Table,但由于股票名称的拼写不同,我丢失了大量数据点。因此,我不是在寻找一个精确的匹配,而是在寻找一个模糊的合并 library("data.table") dt1 = data.table(Name = c("ASML HOLDING","ABN AMRO GROUP"), A = c(1,2)) dt2 = data.table(Name = c("ASML HOLDING NV", "ABN AMRO GROUP"), B = c("p", "q")) 在“名

我尝试合并两个data.Table,但由于股票名称的拼写不同,我丢失了大量数据点。因此,我不是在寻找一个精确的匹配,而是在寻找一个模糊的合并

library("data.table")
dt1 = data.table(Name = c("ASML HOLDING","ABN AMRO GROUP"), A = c(1,2))
dt2 = data.table(Name = c("ASML HOLDING NV", "ABN AMRO GROUP"), B = c("p", "q"))
在“名称”上合并dt1和dt2时,由于添加了“NV”,ASML控股将被排除,而实际数据将是准确的

首选的最终数据输出如下所示:

              Name A B
1:  ABN AMRO GROUP 2 q
2: ASML HOLDING NV 1 p
我接下来尝试的是:

dt1 = dt1[, dt2_NAME := agrep(dt1$Name, dt2$Name, ignore.case = TRUE, value = TRUE, max.distance = 0.05, useBytes = TRUE)]
但是,我得到了以下错误:

参数“pattern”的长度大于1,将只使用第一个元素

<> p>这个错误是有意义的,因为dt1$名称比1长,但我相信这是一个可能的解决方案,如果它将考虑dt1$的名称在行到行的基础上。 这可能是一个愚蠢的错误,但出于某种原因,我就是无法理解它。此外,我更喜欢使用data.table,因为我的数据集相当大,到目前为止,它工作得非常出色。另外,我还不熟悉堆栈溢出,如果我的问题有点不对劲,那么很抱歉

最后,我找到了一段代码,它完成了这项工作,但是对于实际使用来说太慢了


dt1$Name\u dt2使用“fuzzyjoin”的可能解决方案:

library(fuzzyjoin)
f <- Vectorize(function(x,y) agrepl(x, y,
                                   ignore.case=TRUE,
                                   max.distance = 0.05, useBytes = TRUE))

dt1 %>% fuzzy_inner_join(dt2, by="Name", match_fun=f)
#          Name.x A          Name.y B
#1   ASML HOLDING 1 ASML HOLDING NV p
#2 ABN AMRO GROUP 2  ABN AMRO GROUP q

相关:谢谢。我自己没有检查它的更改,但是如果我有一个额外的键(“日期”)进行合并,并且该键必须是精确匹配的,那么这种方法也可以工作吗。基本上,我可以使用一个键的精确匹配(日期)和另一个键的模糊匹配(名称)的组合吗?我还将把这个添加到我的原始问题中。是的,我编辑了我的答案。对于我使用的函数,您必须分两个步骤来完成这项工作,但是该包还包括从每个数据集中使用多个列的可能性。要找到corct语法要复杂一点。。
library(fuzzyjoin)
f <- Vectorize(function(x,y) agrepl(x, y,
                                   ignore.case=TRUE,
                                   max.distance = 0.05, useBytes = TRUE))

dt1 %>% fuzzy_inner_join(dt2, by="Name", match_fun=f)
#          Name.x A          Name.y B
#1   ASML HOLDING 1 ASML HOLDING NV p
#2 ABN AMRO GROUP 2  ABN AMRO GROUP q
dt1 = data.frame(Name = c("ASML HOLDING","ABN AMRO GROUP"), A = c(1,2),Date=c(1,2))
dt2 = data.frame(Name = c("ASML HOLDING NV", "ABN AMRO GROUP", "ABN AMRO GROUP"), B = c("p", "q","r"),Date=c(1,2,3))

dt1 %>% fuzzy_inner_join(dt2, by=c("Date","Name"), match_fun=f) %>% filter(Date.x==Date.y)