假设我有一个长字符串:pneumonultramicroscopicsilicovolcanoosis。我想使用stringr::str_replace_all
来替换某些字母。根据文档,str_replace_all
可以接受一个命名向量,并将名称替换为值。这对于一次替换很有效,但对于多次替换,它似乎是迭代进行的,因此结果是上一次迭代的替换。我不确定这是预期的行为。
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个字母,最好使用两个向量(如"old"和"new")或一个命名向量作为输入。
- reprex经过编辑,便于人类阅读 *
4条答案
按热度按时间kpbwa7wx1#
当我第一次回答这个问题的时候,我有一个拼凑在一起的R包,它只是在我的github上,从那时起,我已经对它进行了实质性的改进,现在它在CRAN上,甚至在其他包中使用。
readme和CRAN的文档都清楚地说明了这一点,但是我理解这个页面上的代码是多么有帮助。更新的用法是基于模式和替换的向量传递的。有一个循环选项允许你提供一个比模式列表更短的替换列表,并且只是在它之间循环。你也可以在后端向regexpr传递参数(例如
fixed=TRUE
)我正在开发一个包来处理这种类型的问题。这比
qdap::mgsub
函数更安全,因为它不依赖于占位符。它完全支持regex作为匹配和替换。您提供一个命名列表,其中的名称是要匹配的字符串,它们的值是替换。pieyvz9o2#
我的解决方法是利用str_replace_all可以将函数作为替换的输入这一事实。
当然,如果你需要放大,我会建议使用更复杂的函数。
ppcbkaq53#
迭代行为是有意的。也就是说,我们可以使用编写自己的工作区。我将使用字符子集来替换。
在一个命名向量中,我们可以通过名称查找事物,并为每个名称获得一个替换值,这就像同时进行所有的替换一样。
这里,在
rules
向量中查找"a"
得到"X"
,有效地将"a"
替换为"X"
,其他字符也是如此。一个问题是没有匹配的名称会产生
NA
。为了防止出现NA,我们可以扩展规则以包括任何新字符,以便字符被其自身替换。
这就是下面这个函数背后的逻辑。
jdzmm42g4#
这个函数的作用可能有一个顺序,所以在用s替换所有的c之后,你用c替换所有的s,只剩下c。