从字符向量中获取近似唯一的值
Getting approximately unique values from character vector
当数据表现良好时,识别 unique
值很简单。在这里,我正在寻找一种方法来从字符向量中获取 近似唯一 值的列表。
设 x
为实体名称略有不同的向量,例如Kentucky loader
可能显示为 Kentucky load
或 Kentucky 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)")
想法
- 计算所有字符串之间的一些相似性度量(例如
Levenshtein distance)
- 使用longest common subset method
- 不知何故 :( 根据此信息决定哪些字符串属于一起。
但我想这将是一项标准任务(对于那些定期使用 "dirty" 数据的 R 用户),所以我假设会有一组标准方法来处理它。
是否有人有提示或是否有执行此操作的软件包?
正如@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
以获得所需的输出。
当数据表现良好时,识别 unique
值很简单。在这里,我正在寻找一种方法来从字符向量中获取 近似唯一 值的列表。
设 x
为实体名称略有不同的向量,例如Kentucky loader
可能显示为 Kentucky load
或 Kentucky 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)")
想法
- 计算所有字符串之间的一些相似性度量(例如 Levenshtein distance)
- 使用longest common subset method
- 不知何故 :( 根据此信息决定哪些字符串属于一起。
但我想这将是一项标准任务(对于那些定期使用 "dirty" 数据的 R 用户),所以我假设会有一组标准方法来处理它。
是否有人有提示或是否有执行此操作的软件包?
正如@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
以获得所需的输出。