stringr包替换字符

时间:2017-08-24 06:12:59

标签: r stringr

我正在尝试使用stringr包替换字符串中的每个字符:

replace_characters <- function(x){str_replace_all(x,c("A"="N",'B'='O','C'='P','D'='Q','E'='R','F'='S','G'='T','H'='U','I'='V','J'='W','K'='X','L'='Y','M'='Z',
'N'='A','O'='B','P'='C','Q'='D','R'='E','S'='F','T'='G','U'='H','V'='I','W'='J','X'='K','Y'='L','Z'='M','0'='5','1'='6','2'='7','3'='8','4'='9','5'='0','6'='1','7'='2','8'='3','9'='4'))}

然后我用随机字符串尝试了这个函数:

replace_characters("HSNKSL584")

我得到了:

"HFAKFL034"

正如您所看到的,一些字母(数字)已按预期被替换,但有些字母保持不变。 谁能解释一下我的原因?

谢谢!

2 个答案:

答案 0 :(得分:4)

在幕后,stringr::str_replace_all会调用stringi的{​​{1}}个功能。如果您使用命名向量来描述多个替换模式(这里就是这种情况),则stri_replace_all_*中包含的相应参数包括stri_replace_all_*

来自vectorize_all = FALSE的帮助文件:

  

但是,对于stri_replace_all *,如果vectorize_all为FALSE,则为每个   子串匹配任何提供的模式替换为a   相应的替换字串。在这种情况下,矢量化是   超过str,并且 - 独立 - 超过模式和替换。其他   单词,这相当于(i in 1:npatterns)str   &lt; - stri_replace_all(str,pattern [i],replacement [i] ...

作为raymkchow&amp; Sotos在评论中指出,当你逐个循环更换模式时,有些会不止一次地受到影响,从而有效地将更换从早期的循环中转移出来。

答案 1 :(得分:0)

我们可以使用chartr

中的base R执行此操作
chartr("HSNKL584", "UFAXY039", "HSNKSL584")
#[1] "UFAXFY039"

这可以成为一个功能

replace_char_fun <- function(str1) {
  old <- paste(c(LETTERS, 0:9), collapse="")
  new <-  paste(c(LETTERS[14:26], LETTERS[1:13], 5:9, 0:4), collapse="")
  chartr(old, new, str1)
}
replace_char_fun( "HSNKSL584")
#[1] "UFAXFY039"