替换 R 中的字符串,给出模式向量和替换向量
replace string in R giving a vector of patterns and vector of replacements
给定一个我想要替换的具有不同占位符的字符串,R 是否有一个函数可以在给定模式向量和替换向量的情况下替换所有占位符?
我已经设法用一个列表和一个循环完成了
> library(stringr)
> tt_ori <- 'I have [%VAR1%] and [%VAR2%]'
> tt_out <- tt_ori
> ttlist <- list('\[%VAR1%\]'="val-1", '\[%VAR2%\]'="val-2")
> ttlist
$`\[%VAR1%\]`
[1] "val-1"
$`\[%VAR2%\]`
[1] "val-2"
> for(var in names(ttlist)) {
+ print(paste0(var," -> ",ttlist[[var]]))
+ tt_out <- stringr::str_replace_all(string = tt_out, pattern =var, replacement = ttlist[[var]] )
+ }
[1] "\[%VAR1%\] -> val-1"
[1] "\[%VAR2%\] -> val-2"
> tt_out
[1] "I have val-1 and val-2"
有一个类似的问题 R: gsub, pattern = vector and replacement = vector 但它要求仅用一种模式替换不同的字符串。在这里,我正在寻找替换单个字符串中的所有模式。
我试过了
> tt_ori <- 'I have VAR1 and VAR2'
> tt_out <- tt_ori
> ttdf <- data.frame(tt=c("VAR1", "VAR2"), val=c("val-1", "val-2"), stringsAsFactors = F)
> str(ttdf)
'data.frame': 2 obs. of 2 variables:
$ tt : chr "VAR1" "VAR2"
$ val: chr "val-1" "val-2"
> stringr::str_replace_all(string = tt_out, pattern =ttdf$tt, replacement = ttdf$val )
[1] "I have val-1 and VAR2" "I have VAR1 and val-2"
显然输出不是我想要的(几个输出字符串,每个字符串只有一个替换)。
我想知道 base 或众所周知的 CRAN 包中是否存在一个函数,该函数会像之前显示的那样被调用,并且能够在单个字符串中进行所有替换。
有人对我的循环有更好的解决方案或建议吗?或者我应该将其转换为函数吗?
[注意]字符串可以是小网页模板,或者配置文件。它们很小,因此循环进行 10 或 20 次替换并不是什么大问题,但我正在寻找更优雅的解决方案。
尝试
library(qdap)
mgsub(c('[%VAR1%]' , '[%VAR2%]'), c('val-1', 'val-2'), tt_ori)
#[1] "I have val-1 and val-2"
数据
tt_ori <- 'I have [%VAR1%] and [%VAR2%]'
这似乎实现了你所需要的。
tt_ori <- 'I have [%VAR1%] and [%VAR2%]'
patterns <- c('\[%VAR1%\]', '\[%VAR2%\]')
replacements <- c("val-1", "val-2")
stringr::str_replace_all(tt_ori, set_names(replacements, patterns))
# [1] "I have val-1 and val-2"
给定一个我想要替换的具有不同占位符的字符串,R 是否有一个函数可以在给定模式向量和替换向量的情况下替换所有占位符?
我已经设法用一个列表和一个循环完成了
> library(stringr)
> tt_ori <- 'I have [%VAR1%] and [%VAR2%]'
> tt_out <- tt_ori
> ttlist <- list('\[%VAR1%\]'="val-1", '\[%VAR2%\]'="val-2")
> ttlist
$`\[%VAR1%\]`
[1] "val-1"
$`\[%VAR2%\]`
[1] "val-2"
> for(var in names(ttlist)) {
+ print(paste0(var," -> ",ttlist[[var]]))
+ tt_out <- stringr::str_replace_all(string = tt_out, pattern =var, replacement = ttlist[[var]] )
+ }
[1] "\[%VAR1%\] -> val-1"
[1] "\[%VAR2%\] -> val-2"
> tt_out
[1] "I have val-1 and val-2"
有一个类似的问题 R: gsub, pattern = vector and replacement = vector 但它要求仅用一种模式替换不同的字符串。在这里,我正在寻找替换单个字符串中的所有模式。
我试过了
> tt_ori <- 'I have VAR1 and VAR2'
> tt_out <- tt_ori
> ttdf <- data.frame(tt=c("VAR1", "VAR2"), val=c("val-1", "val-2"), stringsAsFactors = F)
> str(ttdf)
'data.frame': 2 obs. of 2 variables:
$ tt : chr "VAR1" "VAR2"
$ val: chr "val-1" "val-2"
> stringr::str_replace_all(string = tt_out, pattern =ttdf$tt, replacement = ttdf$val )
[1] "I have val-1 and VAR2" "I have VAR1 and val-2"
显然输出不是我想要的(几个输出字符串,每个字符串只有一个替换)。
我想知道 base 或众所周知的 CRAN 包中是否存在一个函数,该函数会像之前显示的那样被调用,并且能够在单个字符串中进行所有替换。
有人对我的循环有更好的解决方案或建议吗?或者我应该将其转换为函数吗?
[注意]字符串可以是小网页模板,或者配置文件。它们很小,因此循环进行 10 或 20 次替换并不是什么大问题,但我正在寻找更优雅的解决方案。
尝试
library(qdap)
mgsub(c('[%VAR1%]' , '[%VAR2%]'), c('val-1', 'val-2'), tt_ori)
#[1] "I have val-1 and val-2"
数据
tt_ori <- 'I have [%VAR1%] and [%VAR2%]'
这似乎实现了你所需要的。
tt_ori <- 'I have [%VAR1%] and [%VAR2%]'
patterns <- c('\[%VAR1%\]', '\[%VAR2%\]')
replacements <- c("val-1", "val-2")
stringr::str_replace_all(tt_ori, set_names(replacements, patterns))
# [1] "I have val-1 and val-2"