【问题标题】:In R, how do I replace a string that contains a certain pattern with another string?在 R 中,如何将包含特定模式的字符串替换为另一个字符串?
【发布时间】:2011-07-15 05:33:40
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: string r expression gsub


    【解决方案1】:

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

    无论如何,agrep 应该可以解决问题:

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

    编辑:

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

    【讨论】:

    • 感谢您的回复,我刚才玩了agrep。我发现它只是返回一个整数(我猜它对应于更改的字符串数),但它实际上是否执行更改?例如,假设我有动物 = c("mouse", "dog", "cat")。如果我想用“奶酪”代替鼠标,那么我可以使用 agrep(“mou”、“奶酪”、动物)吗?当我这样做时,它返回一个整数(0)。谢谢!!
    • agrep 返回向量索引,因此您可以使用下标轻松分配值:animals[agrep("mou", animals)] <- "cheese"
    • 使用 value = TRUE 返回近似匹配,而不仅仅是索引。
    【解决方案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 函数可以做到这一点。请参阅下面的答案。
    【解决方案3】:

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

    【讨论】:

    • 对于剩下的专业,类似replace(remainingMajor,agrep("biology",remainingMajor),"biology") 应该这样做。
    • (但之前请检查 remainingMajor[agrep("biology",remainingMajor)] 以查看您将要替换的内容)
    【解决方案4】:

    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 
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2021-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 2017-06-25
        相关资源
        最近更新 更多