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

11
我正在处理一个与大学专业数据清洗相关的项目。我发现很多专业名称拼写错误,因此我想使用函数gsub()将其替换为正确的拼写。例如,假设在名为Major的专业列表中“biolgy”被拼错了。如何让R检测到拼写错误并将其替换为正确的拼写?我尝试过gsub('biol', 'Biology', Major),但它只替换了“biolgy”中的前四个字母。如果我使用 gsub('biolgy', 'Biology', Major),那只适用于这个特定的情况,而无法检测出其他形式的“biology”拼写错误。
谢谢!
5个回答

13
你应该定义一些巧妙的正则表达式,或者使用基础包中的agrepstringr包是另一个选择,我知道人们在使用它,但我非常喜欢正则表达式,因此对我来说不行。不管怎样,agrep应该可以解决问题:
agrep("biol", "biology")
[1] 1
agrep("biolgy", "biology")
[1] 1

编辑:

你也应该使用ignore.case = TRUE,但是要准备好手动进行一些记录...


1
谢谢您的回复,我刚刚尝试了一下 agrep。我发现它只返回一个整数(我猜测这个整数对应于更改的字符串数量),但它是否真正执行更改呢?例如,假设我有 animals = c("mouse", "dog", "cat")。如果我想用 "cheese" 替换 mouse,那么我可以使用 agrep("mou", "cheese", animals) 吗?当我这样做时,它返回一个整数(0)。谢谢! - Alan
1
agrep 返回向量索引,因此您可以使用下标轻松地分配值:animals[agrep("mou", animals)] <- "cheese" - aL3xa
1
使用 value = TRUE 返回近似匹配项,而不仅仅是索引。 - Richie Cotton

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

base 包中已经有模糊匹配功能:agrep 函数可以实现。请参见下面的回答。 - aL3xa

2

您可以先将专业与可用专业列表进行匹配,任何不匹配的可能是拼写错误。然后再使用agrep函数将这些匹配项与已知的专业进行匹配(agrep进行近似匹配,因此如果它与正确值相似,则会得到匹配)。


对于其余的专业,可以使用类似 replace(remainingMajor,agrep("biology",remainingMajor),"biology") 这样的语句来完成。 - hatmatrix
请检查 remainingMajor[agrep("biology",remainingMajor)],以确定您将要替换的内容。 - hatmatrix

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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接