【问题标题】:Update Character Variables based on String Pattern in R基于 R 中的字符串模式更新字符变量
【发布时间】:2021-04-20 09:16:50
【问题描述】:

我目前有以下向量,并正在尝试使用 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("1?_lasso", "Lasso")。您要替换子字符串还是整个单词?
  • 我希望替换整个单词。因此,如果它唯一包含“_lasso”,例如“1_lasso”或“_lasso”,请将其替换为“Lasso”。
  • 那么仅供参考,下面的所有答案都将替换 lasso 中的 1_lassosomewordstartingwithlasso

标签: r regex stringr


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我会在这里使用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,它前面可能有也可能没有一些非下划线字符。

    【讨论】:

      【解决方案3】:

      使用

      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"

      【讨论】:

        【解决方案4】:

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

        你可以这样直接解决。

            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* 是任何非空格项,0 次或无限次。

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 2019-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-01
          • 2020-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多