正则表达式 – 如果原始字符串没有,如何知道列表中字符串的变体(
我目前在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]],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.",EnterpriseNumber = c(221L,334L,725L,127L)),"EnterpriseNumber" ),-4L)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |