【问题标题】:Getting approximately unique values from character vector从字符向量中获取近似唯一值
【发布时间】:2016-04-02 16:40:54
【问题描述】:

当数据表现良好时,识别unique 值很简单。在这里,我正在寻找一种从字符向量中获取近似唯一值列表的方法。

x 是一个向量,其实体名称略有不同,例如Kentucky loader 可能显示为 Kentucky loadKentucky loader (additional info) 或类似。

x <- c("Kentucky load" ,                                                                                                            
       "Kentucky loader (additional info)",                                                                                     
       "CarPark Gifhorn (EAP)",
       "Car Park  Gifhorn (EAP) new 1.5.2012",
       "Center Kassel (neu 01.01.2014)",
       "HLLS Bremen (EAP)",
       "HLLS Bremen (EAP) new 06.2013",
       "Hamburg total sum (abc + TBL)",
       "Hamburg total (abc + TBL) new 2012")

我要得到的东西是这样的:

c("Kentucky loader" ,                                                                                                            
  "Car Park Gifhorn (EAP)",
  "Center Kassel (neu 01.01.2014)",
  "HLLS Bremen (EAP)",
  "Hamburg total (abc + TBL)")

想法

  1. 计算所有字符串之间的一些相似性度量(例如 Levenshtein distance)
  2. 使用longest common subset method
  3. 不知何故 :(根据这些信息决定哪些字符串属于一起。

但我想这将是一项标准任务(对于那些经常使用“脏”数据的 R 用户),所以我认为会有一套标准方法来处理它。

是否有人有提示或是否有包可以做到这一点?

【问题讨论】:

  • 您基本上已经概述了“标准”方法。没有像这样清理文本数据的灵丹妙药。您可以使用您似乎已经知道的工具尽力而为,但随后您必须手动查看它。
  • 好吧,如果我真的知道怎么做,我就不会问了;)
  • 不是 R,但 OpenRefine 是专门为此类任务开发的。

标签: r data-cleaning


【解决方案1】:

正如@Jaap 所说,尝试使用 OpenRefine。 data carpentry course 很不错。

如果您确实想留在 R 中,这是您的示例的解决方案,使用 agrepl

z <- sapply(x, function(z) agrepl(z, x, max.distance = 0.2))
apply(z, 1, function(myz) x[myz][which.min(nchar(x[myz]))])

这给出了为 x 的每个成员找到的最小匹配字符:

[1] "Kentucky load"                  "Kentucky load"                  "CarPark Gifhorn (EAP)"         
[4] "CarPark Gifhorn (EAP)"          "Center Kassel (neu 01.01.2014)" "HLLS Bremen (EAP)"             
[7] "HLLS Bremen (EAP)"              "Hamburg total sum (abc + TBL)"  "Hamburg total sum (abc + TBL)" 

如果您想保持向量的顺序以匹配其他向量(或在数据框的列上使用),这很好。

您可以在此输出上调用unique 以获得您想要的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多