【问题标题】:base R alternative for stringr::str_replace_all with c(pattern1 = replacement1) option带有 c(pattern1 = replacement1) 选项的 stringr::str_replace_all 的基本 R 替代方案
【发布时间】:2021-01-04 23:32:42
【问题描述】:

This question 可能在stringr::str_replace_all 拥有该选项(或众所周知)之前正在寻求类似的答案。我正在使用str_replace_all 复制以下答案的要点。


tr <- c("whatevs_1", "something_52", "whatevs_1something_52")

tr
#> [1] "whatevs_1"             "something_52"          "whatevs_1something_52"

patterns <- sprintf('_%s$', c('1','14','22','50','52','57','76','1018','2001','3301','6005'))
replacements <- sprintf('_%s' , c('R','I', 'P', 'O', 'C', 'D', 'M', 'L',   'S',   'K',   'G'))
                        
names(replacements) <- patterns

stringr::str_replace_all(tr, replacements)
#> [1] "whatevs_R"            "something_C"          "whatevs_1something_C"

您将如何在基础 R 中实现上述目标?

提供的最佳选项是 for 循环。只是想知道在此期间是否有人想到了更好的选择。

【问题讨论】:

    标签: r regex stringr


    【解决方案1】:

    我们可以使用for 循环和base R 中的gsub,因为参数不是矢量化的,即?gsub

    pattern - 如果提供长度为 2 或更大的字符向量,则使用第一个元素并发出警告。除 regexpr、gregexpr 和 regexec 外,允许缺少值。

    replacement - 如果提供长度为 2 或更大的字符向量,则使用第一个元素并发出警告。如果为 NA,则结果中与匹配项对应的所有元素都将设置为 NA。

    因此,带有递归赋值的for 循环可能是更好的选择

    for(i in seq_along(patterns)) tr <- gsub(patterns[i], replacements[i], tr)
    
    tr
    #[1] "whatevs_R"            "something_C"          "whatevs_1something_C"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-22
      • 2022-12-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      相关资源
      最近更新 更多