基于 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")
解释
--------------------------------------------------------------------------------
\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
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 次或无限次。
希望对您有所帮助。
我目前有以下矢量,我正在尝试使用 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")
解释
--------------------------------------------------------------------------------
\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
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 次或无限次。
希望对您有所帮助。