我正在尝试使用string r包将字符串中的每个字符替换为以下规则:
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"正如您所看到的,一些字母(数字)如预期的那样被替换,但有些保持不变。有人能给我解释一下原因吗?
谢谢!
发布于 2017-08-24 14:50:16
在幕后,stringr::str_replace_all调用stringi的stri_replace_all_*函数,如果你使用一个命名向量来描述多个替换模式(这里就是这种情况),那么输入到stri_replace_all_*中的相应参数就包含了vectorize_all = FALSE。
来自stri_replace_all_*的帮助文件:
但是,对于stri_replace_all*,如果vectorize_all为FALSE,则与所提供的任何模式匹配的每个子字符串都将替换为相应的替换字符串。在这种情况下,向量化结束字符串,且独立地结束模式和替换。换句话说,这相当于for (i In 1:npattern) str <- stri_replace_all(str,patterni,replacementi...
正如raymkchow & Sotos在评论中指出的那样,当你依次循环替换模式时,一些模式将受到不止一次的影响,有效地逆转了早期循环中的替换。
发布于 2017-08-24 14:45:18
我们可以使用base R的chartr来实现这一点
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"https://stackoverflow.com/questions/45854196
复制相似问题