在字符串的一部分周围插入字符?

Inserting characters around a part of a string?

我希望按照特定规则以矢量化方式在 R 中包装部分字符串。

简单地说,如果我有一个向量:

c("x^2", "x^2:z", "z", "x:z", "z:x:b", "z:x^2:b")

该函数将扫描每个元素并将 I() 环绕那些有指数的部分,从而产生以下输出:

c("I(x^2)", "I(x^2):z", "z", "x:z", "z:x:b", "z:I(x^2):b")

我尝试了各种方法,首先按 : 然后按 gsub 拆分,但这并不是特别可扩展。

这些看起来相当笼统。他们不假设复杂字段中的变量必须命名为 x 但处理任何由单词字符组成的名称,也不假设算术表达式必须是指数但处理任何包含非-单词字符。例如,他们会用 I(...).

包围 y+pi

1) 这个衬垫捕获每个字段并使用指定的函数对其进行处理,以公式表示法表示。它用 I(...) 包围每个包含非单词字符的字段。它适用于名称由单词字符组成的任何变量。

library(gsubfn)

gsubfn("[^:]+", ~ if (grepl("\W", x)) sprintf("I(%s)", x) else x, s)
## [1] "I(x^2)"     "I(x^2):z"   "z"          "x:z"        "z:x:b"     
## [6] "z:I(x^2):b"

2) 这会用 I(...)

包围包含不是 :、字母或数字的字符的任何字段
gsub("([^:]*[^:[:alnum:]][^:]*)", "I(\1)", s)
## [1] "I(x^2)"     "I(x^2):z"   "z"          "x:z"        "z:x:b"     
## [6] "z:I(x^2):b"

3) 在这个替代方案中,我们在冒号处拆分字符串,然后用 I(...) 包围包含非单词字符的字段并将它们粘贴回一起。

surround <- function(x) ifelse(grepl("\W", x), sprintf("I(%s)", x), x)
s |> 
  strsplit(":") |>
  sapply(function(x) paste(surround(x), collapse = ":"))
## [1] "I(x^2)"     "I(x^2):z"   "z"          "x:z"        "z:x:b"     
## [6] "z:I(x^2):b"

备注

使用的输入如下:

s <- c("x^2", "x^2:z", "z", "x:z", "z:x:b", "z:x^2:b")

像下面这样的东西?

> gsub("(x(\^\d+))", "I(\1)", c("x^2", "x^2:z", "z", "x:z", "z:x:b", "z:x^2:b"))
[1] "I(x^2)"     "I(x^2):z"   "z"          "x:z"        "z:x:b"     
[6] "z:I(x^2):b"