bio*_*iha 7 r str-replace stringr
假设我有一个长字符串:pneumonoultramicroscopicsilicovolcanoconiosis。我想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"
Run Code Online (Sandbox Code Playgroud)
想要的结果:
[1] "dpvploepr"
Run Code Online (Sandbox Code Playgroud)
我通过引入一个新角色得到:
text_string %>%
str_replace_all(c(e ="X", p = "e", X = "p"))
Run Code Online (Sandbox Code Playgroud)
这是一个可用的解决方法,但很难推广。这是一个错误还是我的期望错误?
我还希望能够同时用n 个其他字母替换n个字母,最好使用两个向量(如“旧”和“新”)或命名向量作为输入。
reprex 已编辑以便于人类阅读
我正在开发一个包来处理这种类型的问题。这比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"
Run Code Online (Sandbox Code Playgroud)