【问题标题】:replace string in R giving a vector of patterns and vector of replacements替换 R 中的字符串,给出模式向量和替换向量
【发布时间】:2015-02-15 18:52:43
【问题描述】:

给定一个我想要替换的具有不同占位符的字符串,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 包中,它会像前面所示的那样被调用,并且能够在单个字符串中进行所有替换。

是否有人对我的循环有更好的解决方案或建议,或者我应该将其转换为函数吗?

[注意] 字符串可以是小型网页模板,o 配置文件。它们很小,因此循环进行 10 或 20 次替换并不是什么大问题,但我正在寻找更优雅的解决方案。

【问题讨论】:

  • 如果您的预期输出是 tt_out 基于输入 tt_orimgsub 应该可以工作 mgsub(c('[%VAR1%]' , '[%VAR2%]'), c('val-1', 'val-2'), tt_ori)
  • @akrun 你在哪里说 qdap 中的 mgsub? inside-r.org/packages/cran/qdap/docs/multigsub。寻找它,我刚刚找到了这个链接stackoverflow.com/questions/15253954/…,其中实现了一些 mgsub 函数。如果您将评论写为答案,我会接受它
  • @akrun,您之前评论中的 @ 指向其他 Pablo ;-)

标签: r stringr qdap


【解决方案1】:

试试

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%]'

【讨论】:

  • 在mgsub之前没有尝试,因为我没有安装qdap。我在这条评论stackoverflow.com/questions/19424709/… 中看到了这个函数,但他们说它有很多依赖关系,在答案stackoverflow.com/a/19426663/427129 中,他们将mgsub 命令等同于names(x1) &lt;- mapply(gsub, a, b, names(x1)),它没有给出我想要的结果。
  • 谢谢我已经安装了 qdap 及其所有依赖项&gt; install.packages('qdap') also installing the dependencies ‘data.table’, ‘assertthat’, ‘magrittr’, ‘lazyeval’, ‘openNLPdata’, ‘qdapDictionaries’, ‘qdapRegex’, ‘qdapTools’, ‘dplyr’, ‘gender’, ‘gridExtra’, ‘igraph’, ‘NLP’, ‘openNLP’, ‘reports’, ‘stringdist’, ‘tm’, ‘venneuler’,您的回答是正确的。
  • 最后一点:值得注意的是,mgsub 不需要像 gsub 需要的那样转义模式部分中的方括号。另一方面,这意味着它不能接受正则表达式模式。我提出了一个关于如何将正则表达式传递给 mgsub 的新问题。 stackoverflow.com/questions/28532172/…
  • @PabloMarin-Garcia 感谢 cmets。是的,它有很多依赖项。您的新问题已经得到了答案:-)
  • 查看源代码,我注意到mgsub 是围绕gsub 的for 循环。
【解决方案2】:

这似乎达到了你所需要的。

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    相关资源
    最近更新 更多