基于 R 中的字符串模式更新字符变量

Update Character Variables based on String Pattern in R

我目前有以下矢量,我正在尝试使用 stringr 查找模式并更新。

string_vector <- c("1_lasso", "_lasso", "1_lasso_olsps", "_lasso_olsps")

string_vector_new <- string_vector %>%
str_replace("^[1_]_lasso", "Lasso")

[1] "Lasso"                 "_lasso"                "Lasso_olsps"          
 [4] "_lasso_olsps"

我不确定如何,但我希望更新我的代码,以便我可以检测像 1_lasso_lasso 这样的模式,并将它们都更改为 Lasso同时。这可能使用 stringr 吗?我不确定我需要什么正则表达式来进行更新,并且有更多像这些变量一样的变量。

提前致谢。

只需使用 | 字符在模式中设置一个“或”。

str_replace_all(string_vector, "1_lasso|_lasso", "Lasso")

我会在这里使用 sub 和正则表达式模式 [^_]*_lasso:

string_vector <- c("1_lasso", "_lasso", "1_lasso_olsps", "_lasso_olsps")
output <- sub("[^_]*_lasso", "Lasso", string_vector)
output

[1] "Lasso"       "Lasso"       "Lasso_olsps" "Lasso_olsps"

此处使用的模式匹配 _lasso,其前面可能有也可能没有一些非下划线字符。

使用

str_replace_all(string_vector, "\b1?_lasso(?![^\W_])", "Lasso")

regex proof

解释

--------------------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  1?                       '1' (optional (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  _lasso                   '_lasso'
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    [^\W_]                   any character except: non-word
                             characters (all but a-z, A-Z, 0-9, _),
                             '_'
--------------------------------------------------------------------------------
  )                        end of look-ahead

R code snippet:

library(stringr)
string_vector <- c("1_lasso", "_lasso", "1_lasso_olsps", "_lasso_olsps")
str_replace_all(string_vector, "\b1?_lasso(?![^\W_])", "Lasso")

结果[1] "Lasso" "Lasso" "Lasso_olsps" "Lasso_olsps"

如果您喜欢使用正则表达式,那么这是我的解决方案。

你可以直接这样解决。

    string_vector <- c("1_lasso", "_lasso", "1_lasso_olsps", "_lasso_olsps")
    gsub("1_lasso|_lasso","Lasso",string_vector)

[1] "Lasso"       "Lasso"       "Lasso_olsps" "Lasso_olsps"

代码搜索这两个模式并将其替换为“Lasso”

为了使其更通用,我们可以使用下面的代码来查找任何带有“something_lasso”

的模式
gsub("\S*_lasso","Lasso",string_vector)
[1] "Lasso"       "Lasso"       "Lasso_olsps" "Lasso_olsps"

代码查找 \S*_lasso,其中 \S* 是任何非 space 项,0 次或无限次。

希望对您有所帮助。