我的数据中有一列城市,其中同一城市的编写方式不同。例如,城市'班加罗尔'(正确的拼写)被拼写为'bangalore','bengaluru','banglore'等。我想将所有这些不同的拼写拼写成一个正确的拼写。直到现在我一直在手动搜索不同的拼写并用正确的替换它。
任何人都可以帮助我更快地完成此过程,而不是使用R吗?
进行手动操作谢谢
答案 0 :(得分:4)
具有soundex功能的phonics
库在这里可能会有所帮助。假设Bangalore
是正确的拼写,您可以将其他城市名称(可能拼写错误)与此参考进行比较:
library(phonics)
x <- 'Bangalore'
y <- 'Banglore'
if (soundex(x) == soundex(y) & x != y) {
# handle misspelling for Bangalore
}
上述逻辑只是表示如果Bangalore
和Banglore
听起来相同,但拼写不同,则标记该对以供检查。
答案 1 :(得分:1)
下面使用stringdist
的示例,它可以计算字符串之间的相似性。
library(dplyr)
library(stringdist)
生成一些样本数据:
cities <- data.frame(city = c('bangalore','bengaluru','banglore',
'bangalore', 'bangalore', 'bangalore', 'new york', 'newyork',
'nyork', 'new york', 'new york'))
确定唯一值并计算这些值的发生频率(最常见的可能是正确值)
dta <- cities %>% group_by(city) %>% count() %>%
ungroup() %>% mutate(i = row_number())
对于城市名称的每个组合,计算一个类似性,将最相似的一个放在最上面
pairs <- expand.grid(x = seq_len(nrow(dta)), y = seq_len(nrow(dta))) %>%
# Only need to compare i to all records j, with j > i
filter(y > x) %>%
left_join(dta, by = c(x = 'i')) %>% rename(cityx = city, nx = n) %>%
left_join(dta, by = c(y = 'i')) %>% rename(cityy = city, ny = n) %>%
mutate(similarity = stringsim(cityx, cityy, method = "jw")) %>%
arrange(desc(similarity))
然后,您可以调查热门记录:
> pairs
# x y cityx nx cityy ny similarity
# 1 1 2 bangalore 4 banglore 1 0.9629630
# 2 4 5 new york 3 newyork 1 0.9583333
# 3 5 6 newyork 1 nyork 1 0.9047619
# 4 4 6 new york 3 nyork 1 0.8750000
# 5 2 3 banglore 1 bengaluru 1 0.7222222
# 6 1 3 bangalore 4 bengaluru 1 0.6944444
# 7 2 6 banglore 1 nyork 1 0.6583333
# 8 2 5 banglore 1 newyork 1 0.6011905
# 9 1 5 bangalore 4 newyork 1 0.5873016
# 10 2 4 banglore 1 new york 3 0.5833333
# 11 1 4 bangalore 4 new york 3 0.5694444
# 12 3 5 bengaluru 1 newyork 1 0.4761905
# 13 3 4 bengaluru 1 new york 3 0.4583333
# 14 1 6 bangalore 4 nyork 1 0.4370370
# 15 3 6 bengaluru 1 nyork 1 0.4370370
您可以在stringsim
中尝试不同的方法。 Jaro-Winkler的优势在于它对于大型数据集来说相对较快。
语音编码器有时太粗糙(安静的不同字符串可以具有相同的语音编码;尤其是soundex),并且通常是针对(美国)姓氏开发的。