在字符串的一部分周围插入字符?
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"
我希望按照特定规则以矢量化方式在 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"