首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:使用agrep和data.table进行模糊合并

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

Stack Overflow用户
提问于 2018-09-19 09:38:09
回答 1查看 1.9K关注 0票数 2

我试图合并两个data.tables,但是由于股票名称的拼写不同,我丢失了大量的数据点。因此,而不是完全匹配,我是在调查模糊合并。

代码语言:javascript
复制
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将被排除在外,而实际数据将是准确的。

优先的最终数据输出看起来有些类似于:

代码语言:javascript
复制
              Name A B
1:  ABN AMRO GROUP 2 q
2: ASML HOLDING NV 1 p

接下来我尝试了以下几点:

代码语言:javascript
复制
dt1 = dt1[, dt2_NAME := agrep(dt1$Name, dt2$Name, ignore.case = TRUE, value = TRUE, max.distance = 0.05, useBytes = TRUE)]

但是,我得到以下错误,

参数‘模式’的长度>1,只使用第一个元素

这个错误是有意义的,因为dt1$Name比1长,但是我相信如果它考虑dt1$Name在一行的基础上,这将是一种可能的解决方案。

这可能是个愚蠢的错误,但出于某种原因,我就是无法理解它。此外,我更喜欢使用data.table,因为我的数据集相当大,而且到目前为止它已经非常出色地工作了。另外,我对堆栈溢出很陌生,如果我的问题有点不完善的话,很抱歉。

最后,我找到了一段代码来完成这项工作,但是速度太慢,无法实际使用。R中的模糊合并

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-19 09:59:42

使用“fuzzyjoin”的可能解决方案:

代码语言:javascript
复制
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来结束调用的原因。

此方法可与equi一起使用(请注意by!中列的顺序):

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52402768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档