我正在尝试使用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"
正如您所看到的,一些字母(数字)已按预期被替换,但有些字母保持不变。 谁能解释一下我的原因?
谢谢!
答案 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"