当前位置: 首页 > 面试题库 >

通过R中变量的模糊匹配进行合并

景子安
2023-03-14
问题内容

我有两个dataframes(X,Y),其中ID是student_namefather_namemother_name。由于存在印刷错误(“
n”而不是“
m”,随机的空格等),尽管我可以查看数据并看到应有的值,但我仍有大约60%的值未对齐。有没有办法以某种方式减少不匹配的程度,以便至少可以进行手动编辑?数据帧具有约700K观测值。

R最好。我知道一些python和一些基本的unix工具。PS我继续阅读agrep(),但不了解如何将其应用于实际数据集,尤其是当匹配项涉及多个变量时。

更新(发布的赏金数据):

这是两个示例数据帧,sites_asites_b。他们可以在数字列匹配latlon以及在sitename列。了解如何在a)仅lat+
lon,b)sitename或c)两者上完成此操作将很有用。

您可以获取文件test_sites.R作为要点发布。

理想情况下,答案将以

merge(sites_a, sites_b, by = **magic**)

问题答案:

agrep函数(基数R的一部分)使用Levenshtein编辑距离进行近似字符串匹配可能值得尝试。不知道您的数据是什么样子,我无法真正提出可行的解决方案。但这是一个建议……它会将比赛记录在一个单独的列表中(如果有多个同样出色的比赛,那么也会记录这些比赛)。假设您的data.frame称为df

l <- vector('list',nrow(df))
matches <- list(mother = l,father = l)
for(i in 1:nrow(df)){
  father_id <- with(df,which(student_name[i] == father_name))
  if(length(father_id) == 1){
    matches[['father']][[i]] <- father_id
  } else {
    old_father_id <- NULL
    ## try to find the total                                                                                                                                 
    for(m in 10:1){ ## m is the maximum distance                                                                                                             
      father_id <- with(df,agrep(student_name[i],father_name,max.dist = m))
      if(length(father_id) == 1 || m == 1){
        ## if we find a unique match or if we are in our last round, then stop                                                                               
        matches[['father']][[i]] <- father_id
        break
      } else if(length(father_id) == 0 && length(old_father_id) > 0) {
        ## if we can't do better than multiple matches, then record them anyway                                                                              
        matches[['father']][[i]] <- old_father_id
        break
      } else if(length(father_id) == 0 && length(old_father_id) == 0) {
        ## if the nearest match is more than 10 different from the current pattern, then stop                                                                
        break
      }
    }
  }
}

的代码mother_name基本相同。您甚至可以将它们组合成一个循环,但是此示例仅出于说明目的。



 类似资料:
  • 问题内容: 我有两个要基于列合并的DataFrame。但是,由于其他拼写方式,空格数量不同,不存在变音符,只要它们彼此相似,我希望能够合并。 任何相似性算法都可以使用(soundex,Levenshtein,difflib)。 假设一个DataFrame具有以下数据: 然后我想得到结果DataFrame 问题答案: 类似建议,你可以申请的到df2的指标,然后应用: 如果这些是列,则可以按照相同的方

  • 问题内容: 我刚刚开始探索Elasticsearch。我创建了一个文档,如下所示: 我现在尝试对Levenshtein距离为5的名称字段进行模糊搜索,如下所示: 但是它没有返回任何匹配。我希望圣路易斯的记录能归还。我该如何解决我的查询? 谢谢。 问题答案: 您的查询存在的问题是,最大编辑距离为2。 在上述情况下,您可能想要做的是将St.改为Saint 的同义词,这将与您匹配。当然,这将取决于您的数

  • 问题内容: 我想对Elasticsearch的电子邮件或电话进行模糊匹配。例如: 匹配所有以结尾的电子邮件 要么 匹配所有电话开头。 我知道我可以使用通配符 但是性能很差。我尝试使用regexp: 但是不起作用。 有更好的方法吗? curl -XGET本地主机:9200 / user_data 映射: 问题答案: 一种简单的方法是创建一个自定义分析器,该分析器使用电子邮件的n-gram令牌过滤器(

  • 问题内容: 我在项目中使用模糊匹配,主要是查找拼写错误和具有相同名称的不同拼写。我需要完全了解elasticsearch的模糊匹配如何工作以及它如何使用标题中提到的2个参数。 据我了解, min_similarity 是查询的字符串与数据库中的字符串匹配的百分比。我找不到有关此值如何计算的确切描述。 据我了解, max_expansions 是应该执行搜索的Levenshtein距离。如果这实际上

  • 我有一个包含100,000行(人)和500列(概率)的数据集,我想用测试概率扫描各列,以找到大于和最接近测试值的列标题(a、b或c ),并将标题记录在新列中。 以数据表为例: 新列将记录“a”(0.1 我最初做它作为一个矩阵,而不是data.table.下面的代码不会工作,但给出了一个想法,它是如何运作的 如何跨 data.table 中的列执行此匹配。我认为我需要使用 来自 的查询。但不确定如何

  • 问题内容: 我试图模糊匹配两个csv文件,每个文件包含一列名称,它们相似但不相同。 到目前为止,我的代码如下: 输出如下: 该脚本工作正常。输出是预期的。但是我所寻找的只是最佳的匹配。 因此,我需要基于第2列中的最大值,以某种方式删除第1列中的重复名称。这应该相当简单,但是我似乎无法弄清楚。任何帮助,将不胜感激。 问题答案: Fuzzywuzzy会以反向排序的顺序返回列表,最佳匹配排在最前面。 因