我目前在R中搜索一个让我匹配/合并两个数据帧的方法. Helas这两个数据帧都包含非最佳数据.他们可以有一些甚至错字的缩写.因此,我想为每个缩写定义一个列表,如果一个字符串包含其中一个元素.如果原始条目不匹配,则R应检查缩写的任何其他选项是否匹配.举例说明:公司名称可以以“Limited”结尾,也可以以“Ltd.”结尾. “有限公司”等
例
数据
原始“地址”文件包含:
Company name Address
Deloitte Ltd. New York
Coca-Cola New York
Tesla ltd California
Microsoft Limited Washington
必须与“EnterpriseNrList”合并
Company name EnterpriseNumber
Deloitte Ltd. 221
Coca-Cola 334
Tesla ltd 725
Microsoft Limited 127
所以缩写应该在“双向”中起作用.这就是为什么我说,如果R识别出任何缩写,R应该尝试匹配所有这些缩写.
所有比赛都应报告为回归.
因此,我会为每个可能的缩写组成一个列表“缩写”
Limited.
limited
Ltd.
ltd.
Ltd
ltd
问题
1)这是一个好方法,还是会有更有效的方法?
2)如何根据可能的缩写列表检查列表(步骤1,见下文),从excel中排序containsx?
3)我如何编制一个列表来替换与所有其他abbreviatinos不匹配的条目(步骤2,见下文)?
解决方案的想法
步骤1
由于我对这类工作还很陌生,我在考虑以下内容:使用正则表达式来过滤掉一个包含任何缩写选项的字符串并创建一个列表,如果不匹配则该列表将包含-1找到并且如果找到匹配则> 0.无模式匹配已经可以与“地址”列表匹配.在其他条目中,我继续第2步.
在这一步中,我真的不知道如何检查选项列表(“缩写”列表).
第2步
接下来,我将创建一个列表,其中包含步骤1中的匹配项以及rbind所有选项.在这一步我真的不知道我可以创建一个结合f.e.的列表.可口可乐提供所有可能的缩写.
Coca-Cola Limited
Coca-Cola Ltd.
Coca-Cola Ltd
etc.
第3步
最后,我将使用原始“数据”列表再次匹配/合并这个更完整的公司列表.随着步骤2的引入,我认为在所需的计算能力上可能会更容易,因为原始列表大约是8000行.
最佳答案 我会采用不同的方法,在合并之前先修复表格.
为了解决abreviations,我会使用正则表达式,不区分大小写,最后一个点是optionnal,我从一个’Normal word’=缩写矢量列表开始.
abbrevs <- list('Limited'=c('Limited','Ltd'),'Incorporated'=c('Incorporated','Inc'))
我构建了相应的正则表达式(在结尾处使用可选点进行替换,gsub和agrep中的参数将忽略该情况):
regexes <- lapply(abbrevs,function(x) { paste0("(",paste0(x,collapse='|'),")[.]?") })
这使:
$Limited
[1] "(Limited|Ltd)[.]?"
$Incorporated
[1] "(Incorporated|Inc)[.]?"
现在我们必须将每个正则表达式应用于每个df的company.name列:
for (i in seq_along(regexes)) {
Address$Company.name <- gsub(regexes[[i]], names(regexes[i]), Address$Company.name, ignore.case=TRUE)
Enterprise$Company.name <- gsub(regexes[[i]], names(regexes[i]), Enterprise$Company.name, ignore.case=TRUE)
}
这不考虑拼写错误.在这里,您需要与agrepor adist合作进行管理.
地址示例数据集的结果:
> Address
Company.name Address
1 Deloitte Limited New York
2 Coca-Cola New York
3 Tesla Limited California
4 Microsoft Limited Washington
使用的输入数据:
Address <- structure(list(Company.name = c("Deloitte Ltd.", "Coca-Cola",
"Tesla ltd", "Microsoft Limited"), Address = c("New York", "New York",
"California", "Washington")), .Names = c("Company.name", "Address"
), class = "data.frame", row.names = c(NA, -4L))
Enterprise <- structure(list(Company.name = c("Deloitte Ltd.", "Coca-Cola",
"Tesla ltd", "Microsoft Limited"), EnterpriseNumber = c(221L,
334L, 725L, 127L)), .Names = c("Company.name", "EnterpriseNumber"
), class = "data.frame", row.names = c(NA, -4L))