3

我有一个包含约一百万个观察值的大型数据集,并以定义的观察类型为键。在数据集中,有大约 900,000 个观测类型错误的观测值,其中 50 种可接受的观测值类型有大约 850 个(不正确)变体。

keys <- c("DAY", "EVENING","SUNSET", "DUSK","NIGHT", "MIDNIGHT", "TWILIGHT", "DAWN","SUNRISE", "MORNING")

entries <- c("Day", "day", "SUNSET/DUSK", "DAYS", "dayy", "EVEN", "Evening", "early dusk", "late day", "nite", "red dawn", "Evening Sunset", "mid-night", "midnight", "midnite","DAY", "EVENING","SUNSET", "DUSK","NIGHT", "MIDNIGHT", "TWILIGHT", "DAWN","SUNRISE", "MORNING")

使用 gsub 类似于用手铲挖地下室,而在我自己的情况下,是一把破碎的铲子,因为我对 r 和复杂的正则表达式非常陌生。简单的回退(对我而言)是为每种接受的观察类型编写一个 gsub 语句,但这似乎不必要地费力,因为它需要 50 条语句。

我想使用levenshtein.distancestringdist用最短距离字符串替换有问题的条目。运行z <- for (i in length(y)) { z[i] = levenshtein.distance(y[i], x)}不起作用,因为它试图将 (length(x)) 结果传递给每个 y[i]。

如何以最小距离返回结果?我已经看到function(x) x[2]返回系列中的第二个结果,但是如何获得最低的结果?

4

1 回答 1

4

你可以试试:

library(stringdist)
m <- stringdistmatrix(entries, keys, method = "lv")
a <- keys[apply(m, 1, which.min)]

如果您想尝试不同的算法,请查看?'stringdist-metrics'


或者按照@RHertel 在评论中提到的:

b <- keys[apply(adist(entries, keys), 1, which.min)]

adist()文档:

计算字符向量之间的近似字符串距离。该距离是广义的 Levenshtein(编辑)距离,给出了将一个字符串转换为另一个字符串所需的插入、删除和替换的最小可能加权数。

这两种方法产生相同的结果:

> identical(a, b)
#[1] TRUE
于 2015-10-22T15:30:01.473 回答