2015-10-22 51 views
2

我有一个大型的数据集,有一百万个观察值,用一个已定义的观察类型键入。在数据集中,有大约900,000个观测类型异常的观测,其中50个可接受的观测类型有〜850个(不正确)的变化。r stringdist或levenshtein.distance替换字符串

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)}不起作用,因为它试图将(长度(x))结果传递给每个y [i]。

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

+0

你可能想看看)adist的'文档('。 – RHertel

+0

将“SUNSET”和“DUSK”与“SUNSET/DUSK”进行比较时,您需要指定您认为正确的匹配, –

+0

“SUNSET/DUSK”应通过距离方法评估为“SUNSET”。数据集的性质使我无法确定“DUSK”或“SUNSET”是否更合适。 , –

回答

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 
+1

我大声欢呼,吓坏了狗!非常感谢你们两位! adist正是我所期待的!巨大的微笑。谢谢。 –