【问题标题】:R: Fuzzy merge using agrep and data.tableR:使用 agrep 和 data.table 进行模糊合并
【发布时间】:2018-09-19 09:38:09
【问题描述】:

我尝试合并两个 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 HOLDING将被排除在外,而实际数据将是准确的。

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

              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 并且只使用第一个元素

这个错误是有道理的,因为 dt1$Name 比 1 长,但我相信如果它会逐行考虑 dt1$Name,这将是一个可能的解决方案。

这可能是一个愚蠢的错误,但由于某种原因,我无法理解它。此外,我更喜欢使用 data.table,因为我的数据集相当大,到目前为止它工作得非常好。此外,我是堆栈溢出的新手,如果我的问题有些不对劲,请见谅。

最后,我发现了一段代码可以完成这项工作,但对于实际使用来说太慢了。 Fuzzy merge in R

dt1$Name_dt2 <- "" # Creating an empty column
for(i in 1:dim(dt1)[1]) {
  x <- agrep(dt1$Name[i], dt2$Name,
             ignore.case=TRUE, value=TRUE,
             max.distance = 0.05, useBytes = TRUE)
  x <- paste0(x,"")
  dt1$Name_dt2[i] <- x
}

【问题讨论】:

标签: r data.table agrep


【解决方案1】:

使用 '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

注意:您也遇到的主要问题是 agrepagrepl 似乎不希望第一个参数是向量。这就是我使用Vectorize 结束通话的原因。

此方法可以与等值连接一起使用(注意by! 中的列顺序):

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)

【讨论】:

  • 谢谢。我没有自己检查它的变化,但如果我有一个附加键(“日期”)要合并,它必须是完全匹配的,这种方法是否也有效。基本上我可以使用一个键的精确匹配(日期)和另一个键的模糊匹配(名称)的组合吗?我也会将此添加到我原来的问题中。
  • 是的,我编辑了我的答案。使用我使用的函数,您必须分两步完成,但该包还包括使用每个数据集中的多个列的可能性。找到 corct 语法只是有点复杂..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2021-08-21
相关资源
最近更新 更多