2011-03-14 38 views
11

我正在研究一个涉及清理大学专业数据清单的项目。我发现很多拼写错误,所以我正在使用函数gsub()来替换拼写错误的拼写错误。例如,说'biolgy'拼写错误的专业称为主要名单。我如何让R检测拼写错误并将其替换为正确的拼写?我试过gsub('biol', 'Biology', Major),但是它只替换了'biolgy'中的前四个字母。如果我做gsub('biolgy', 'Biology', Major),它仅适用于这种情况,但这并不能检测到其他形式的“生物学”拼写错误。在R中,如何用另一个字符串替换包含特定模式的字符串?

谢谢!

回答

13

您应该定义一些漂亮的正则表达式,或者使用agrepbase包。 stringr包是另一种选择,我知道人们使用它,但我是一个非常巨大的正则表达式的粉丝,所以对我来说这是一个禁忌。

反正agrep应该做的伎俩:

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

编辑:

您还应该使用ignore.case = TRUE,但要准备 “手动” 做一些簿记...

+0

感谢您的回复,我刚刚与agrep一起玩过。我发现它只是返回一个整数(我猜对应于更改的字符串的数量),但它实际上是否执行更改?例如,假设我有动物= c(“老鼠”,“狗”,“猫”)。如果我想用“奶酪”代替鼠标,那么我可以使用agrep(“mou”,“奶酪”,动物)吗?当我这样做时它返回一个整数(0)。谢谢!! – Alan 2011-03-14 18:57:36

+0

'agrep'返回矢量指数,所以你可以很容易地使用下标来指定一个值:'动物[agrep(“mou”,动物)]​​ < - “奶酪”' – aL3xa 2011-03-14 19:10:04

+0

非常感谢你:) – Alan 2011-03-14 19:19:07

2

您可以设置所有可能拼写错误的矢量,然后通过gsub调用进行循环。喜欢的东西:

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

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

如果你想要做的事聪明,看看是否有关于CRAN任何模糊匹配的软件包,或使用“同音”匹配的东西....

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

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

+0

'base'包中已经有模糊匹配:'agrep'函数可以做到这一点。请参阅下面的答案。 – aL3xa 2011-03-14 18:49:27

2

你可以首先匹配专业与可用专业名单,任何不匹配,然后可能misspellings。然后使用agrep函数将这些与已知专业相匹配(agrep进行近似匹配,所以如果它与正确的值相似,那么您将得到一个匹配)。

+0

对于重整专业的学生来说,像replace(剩余的主要,agrep(“生物学”,剩下的主要),“生物学”)这样的东西应该这样做。 – hatmatrix 2011-03-14 18:50:27

+0

(但请查阅'remainingMajor [agrep(“biology”,remainingMajor)]'以查看您将要替换的内容) – hatmatrix 2011-03-14 18:51:35

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 
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)

相关问题