2017-08-24 80 views
2

我想用下面使用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" 

正如你所看到的一些字母(数字)已被替换为预期,但一些保持不变。 任何人都可以解释我的理由吗?

谢谢!

+1

我发现''''stringr :: str_replace_all (“H”,c(“H”=“U”,“U”=“H”))''''也不会对'''“H”'''做任何事。 – raymkchow

+2

是不是所期望的?既然你有'A = B',然后'B = A' ? – Sotos

回答

0

我们可以从chartrbase 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" 
3

在幕后,在stringistri_replace_all_*功能stringr::str_replace_all调用。如果使用命名向量来描述多个替换模式(这里是这种情况),则输入到stri_replace_all_*中的相应参数包括vectorize_all = FALSE

stri_replace_all_*的帮助文件:

然而,对于stri_replace_all *,如果vectorize_all是FALSE,则每个 子串匹配任何所提供的图案的由 相应替换字符串替换。在这种情况下,str上的向量化为 ,并且 - 独立地通过模式和替换。在其它 换言之,这等同于类似为(I在1:npatterns)STR < - stri_replace_all(STR,图案[I],更换[I] ...

作为raymkchow &索托斯有在评论中指出,当你依次逐个更换替换模式时,有一些将会不止一次受到影响,从而有效地改变早期循环的替换方式。