假设我有一个很长的字符串:pneumonoultramicroscopesilicovolcanoconiosis。我想用stringr::str_replace_all
用其他字母替换某些字母。根据文档,str_replace_all
可以采用命名向量并用值替换名称。这对于 1 次替换效果很好,但对于多次替换,它似乎是迭代执行的,因此结果是前一次迭代的替换。我不确定这是预期的行为。
library(tidyverse)
text_string = "developer"
text_string %>%
str_replace_all(c(e ="X")) #this works fine
[1] "dXvXlopXr"
text_string %>%
str_replace_all(c(e ="p", p = "e")) #not intended behaviour
[1] "develoeer"
期望的结果:
[1] "dpvploepr"
我通过引入一个新角色得到:
text_string %>%
str_replace_all(c(e ="X", p = "e", X = "p"))
这是一个可用的解决方法,但很难推广。这是一个错误还是我的期望错误?
我也希望能够更换n字母与n同时使用其他字母,最好使用两个向量(如“旧”和“新”)或命名向量作为输入。
reprex 已编辑以方便人类阅读
2023 更新
当我第一次回答这个问题时,我的 github 上有一个 R 包。从那时起,我对其进行了大幅改进,现在它已在 CRAN 上,甚至在其他软件包中使用。
The readmeCRAN 文档详细说明了所有这些,但我了解此页面上的代码有多么有用。更新的用法基于传入模式和替换向量。有一个回收选项,允许您提供比模式列表短的替换列表,并继续循环遍历它。您还可以将参数传递给后端的 regexpr (例如fixed=TRUE
)
install.packages('mgsub')
mgsub("developer",
pattern = c("e", "p"),
replacements = c("p", "e"))
#> [1] "dpvploepr"
原答案
我正在开发一个包来处理此类问题。这比更安全qdap::mgsub
函数,因为它不依赖占位符。它完全支持正则表达式作为匹配和替换。您提供一个命名列表,其中名称是要匹配的字符串,它们的值是替换项。
devtools::install_github("bmewing/mgsub")
library(mgsub)
mgsub("developer",list("e" ="p", "p" = "e"))
#> [1] "dpvploepr"
qdap::mgsub(c("e","p"),c("p","e"),"developer")
#> [1] "dpvploppr"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)