我有一个大型的数据集,其中包含大约一百万个观察结果,并使用定义的观察类型进行键控。在数据集中,有大约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.distance
或stringdist
用最短的距离字符串替换有问题的条目。运行z <- for (i in length(y)) { z[i] = levenshtein.distance(y[i], x)}
并不起作用,因为它试图将(长度(x))结果传递给每个y [i]。
如何以最小距离返回结果?我已经看到function(x) x[2]
返回系列中的第二个结果,但是如何获得最低?
答案 0 :(得分:2)
你可以尝试:
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