【问题标题】:Replace similar incorrectly spelled words替换类似的拼写错误的单词
【发布时间】:2018-06-04 19:52:17
【问题描述】:

我正在尝试修复我的调查数据。我的数据框包含多个应该相同的值;但是,拼写、间距和大小写存在差异,导致级别数超出预期。

str(data.frame$race)
"American Indian and Alaska Native" 
"Asian"                             
"Black of African American"        
"Black or African American"         
"Other"                            
"Unknown"                          
"white or Caucasian"                
"White or Caucasian"                
"White or Caucasion" 

我如何“查找和替换”以创建一个统一的拼写并将其转换回具有适当级别数的因子?

【问题讨论】:

  • 能否请您输入您的数据集?
  • 你可能想看看 OpenRefine ...
  • 你也可以看看phonicssoundex(c("Black of African American", "Black or African American", "white or Caucasian", "White or Caucasian", "White or Caucasion"))# [1] "B420" "B420" "W300" "W300" "W300"
  • 这个答案非常接近你想要的...stackoverflow.com/questions/38956241/…...不确定是否值得一个新的答案...?

标签: r


【解决方案1】:

很难找到一种万能的解决方案。这是因为看起来相似的字符串可能描述了非常不同的事物(例如格拉纳达与格林纳达)。原帖下的cmets值得研究。

参见"Approximate string matching" on Wikipedia(有时也称为“模糊匹配”)。如您所见,有很多方法可以在字符串上定义“相似”。

最基本的工具是R函数adist。它计算所谓的编辑距离。

x <- c("American Indian and Alaska Native" ,
   "Asian"                             ,
   "Black of African American"        ,
   "Black or African American"         ,
   "Other"                            ,
   "Unknown"                          ,
   "white or Caucasian"                ,
   "White or Caucasian"                ,
   "White or Caucasion" )
u <- unique(x)
# compare all strings against each other
d <- adist(u)
# Do not list combinations of similar words twice
d[lower.tri(d)] <- NA
# Say your threshold below which you want to consider strings similar is 
# 2 edits:
a <- which(d > 0 & d < 2, arr.ind = TRUE)
a
##      row col
## [1,]   3   4
## [2,]   7   8
## [3,]   8   9
pairs <- cbind(u[a[,1]], u[a[,2]])
pairs
##      [,1]                        [,2]                       
## [1,] "Black of African American" "Black or African American"
## [2,] "white or Caucasian"        "White or Caucasian"       
## [3,] "White or Caucasian"        "White or Caucasion" 

但最终,您必须自己策划结果,以避免不公平因素的意外均衡。

您可以通过使用命名向量作为翻译字典来重复执行此操作。例如,通过查看上面的示例,我可以创建以下字典:

dict <- c(
   # incorrect spellings          correct spellings
   # -------------------------    ----------------------------
   "Black of African American" =  "Black or African American",
   "white or Caucasian"        =  "white or Caucasian"       ,
   "White or Caucasion"        =  "White or Caucasian" 
)
# The correct levels need to be included, to
dict <- c(dict, setNames(u,u)

然后使用as.character 将您的因子列转换为字符并应用 上面的字典就像我在这里用原始字符向量x:

xcorrected <- dict[x]
# show without names, but the result is also correct if you just use
# xcorrected alone (remove as.character here to see the difference).
as.character(xcorrected)
[1] "American Indian and Alaska Native" "Asian"                            
[3] "Black or African American"         "Black or African American"        
[5] "Other"                             "Unknown"                          
[7] "white or Caucasian"                "White or Caucasian"               
[9] "White or Caucasian"              

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 1970-01-01
    • 2019-10-22
    • 2010-10-16
    • 2018-11-25
    • 2011-04-25
    • 2018-05-23
    • 2015-05-06
    • 2018-12-07
    相关资源
    最近更新 更多