这个问题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"
Run Code Online (Sandbox Code Playgroud)
您将如何在 R 基础上实现上述目标?
提供的最佳选择是 for 循环。只是想知道是否有人同时想到了更好的选择。
我们可以使用for带有gsubfrom的循环base R,因为参数没有向量化,即?gsub
模式 - 如果提供长度为 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"
Run Code Online (Sandbox Code Playgroud)