2015-10-22 6 views
2

У меня есть большой набор данных с ~ миллионами наблюдений с ключом определенного типа наблюдения. В наборе данных имеется ~ 900 000 наблюдений с искаженными типами наблюдений с ~ 850 (неправильными) вариациями 50 приемлемых типов наблюдений.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 сродни рытье фундамента с ручной лопатой, и в моем случае, сломанная рукоять лопаты, как я очень новый с г и тонкостями регулярных выражений. Простой резерв (для меня) заключается в том, чтобы написать один оператор gsub для каждого из принятых типов наблюдений, но это кажется излишне трудным, так как ему требуется 50 заявлений.

Я хотел бы использовать levenshtein.distance или stringdist, чтобы заменить нарушающие записи кратчайшей длиной. Запуск z <- for (i in length(y)) { z[i] = levenshtein.distance(y[i], x)} не работает, поскольку он пытается передать (length (x)) результаты для каждого y [i].

Как вернуть результат с минимальным расстоянием? Я видел function(x) x[2], который возвращает 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() документация:

Вычислить приблизительное расстояние строки между векторами символов. Расстояние - это обобщенное расстояние Левенштейна (редактирование), дающее минимальное возможное взвешенное количество вставок, исключений и подстановки, необходимые для преобразования одной строки в другую.

Оба метода дают одинаковые результаты:

> identical(a, b) 
#[1] TRUE 
+1

Я громко рассмеялся и испугал собаку! Большое вам спасибо! adist был именно тем, что я искал! ОГРОМНЫЕ УБЫТКИ. Спасибо. –