在R中,如何用另一个字符串替换包含某个模式的字符串?

时间:2011-03-14 18:20:23

标签: string r expression gsub

我正在开展一项涉及清理大学专业数据清单的项目。我发现很多拼写错误,所以我希望使用函数gsub()用拼写正确的拼写替换拼错拼写的函数。例如,假设'biolgy'在名为Major的专业列表中拼写错误。如何让R检测拼写错误并用正确的拼写替换它?我试过gsub('biol', 'Biology', Major),但只替换了'biolgy'中的前四个字母。如果我做gsub('biolgy', 'Biology', Major),它仅适用于该案例,但这并不能检测出“生物学”的其他形式的拼写错误。

谢谢!

5 个答案:

答案 0 :(得分:13)

您应该定义一些漂亮的正则表达式,或者使用agrep包中的basestringr包是另一种选择,我知道人们使用它,但我是正则表达式的忠实粉丝,所以对我来说这是禁忌。

无论如何,agrep应该做到这一点:

agrep("biol", "biology")
[1] 1
agrep("biolgy", "biology")
[1] 1

编辑:

您还应该使用ignore.case = TRUE,但要做好“手工”记账的准备......

答案 1 :(得分:2)

您可以设置所有可能拼写错误的向量,然后对gsub调用进行循环。类似的东西:

biologySp = c("biolgy","biologee","bologee","bugs")

for(sp in biologySp){
  Major = gsub(sp,"Biology",Major)
}

如果你想更聪明地做一些事情,看看CRAN上是否有任何模糊匹配包,或者使用'soundex'匹配的东西....

大约维基百科页面字符串匹配可能很有用,并尝试在R-help中搜索一些关键术语。

http://en.wikipedia.org/wiki/Approximate_string_matching

答案 2 :(得分:2)

你可以先将这些专业与可用专业的列表进行匹配,任何不匹配的专业都可能是错误的。然后使用agrep函数再次将这些与已知专业相匹配(agrep进行近似匹配,因此如果它与正确的值类似,那么您将获得匹配)。

答案 3 :(得分:0)

vwr包具有字符串匹配方法:

http://ftp.heanet.ie/mirrors/cran.r-project.org/web/packages/vwr/index.html

所以你最好的选择可能是使用与可能的主题字符串具有最小Levenshtein距离的字符串:

> levenshtein.distance("physcs",c("biology","physics","geography"))
  biology   physics geography 
        7         1         9 

如果你获得相同的最小值,那么翻一下硬币:

> levenshtein.distance("biolsics",c("biology","physics","geography"))
  biology   physics geography 
        4         4         8 

答案 4 :(得分:0)

示例1a)perl / linux正则表达式:'s/oldstring/newstring/'

例1b)R等价于1a:srcstring=sub(oldstring, newstring, srcstring)

示例2a)perl / linux正则表达式:'s/oldstring//'

示例2b)R等价于2a:srcstring=sub(oldstring, "", srcstring)