【问题标题】:Use fixed() for multiple patterns in stringr::str_replace_all()对 stringr::str_replace_all() 中的多个模式使用 fixed()
【发布时间】:2020-12-17 09:47:12
【问题描述】:

我想同时str_replace() 多个fixed() 模式,但是

c("pattern1" = "replacement1", "pattern2" = "replacement2", ...) 

语法不适用

c(fixed("pattern1") = "replacement1", fixed("pattern2") = "replacement2", ...) 

当我需要在 LHS 上进行函数调用时,看起来这种 name = value 语法是不可能的。

关于如何使用stringr::str_replace_all() 进行编码的任何想法?

str_replace_all() 仅在使用正则表达式默认值时工作正常。我还可以管理底层的stringi::stri_replace_all_fixed() 函数来工作。

library(dplyr)
library(stringr)

sw <- dplyr::starwars %>%
  mutate(
    hair_skin_eye = str_c(hair_color, skin_color, eye_color, sep = " | ")
  ) %>%
  select(name, hair_skin_eye)

# using default (regex)
sw %>%
  mutate(
    hair_skin_eye_repl = str_replace_all(
      string = hair_skin_eye,
      c(
        "white" = "WHITE",
        "blue" = "BLUE",
        "yellow" = "YELLOW"
      )
    )
  )
#> # A tibble: 87 x 3
#>    name              hair_skin_eye                 hair_skin_eye_repl           
#>    <chr>             <chr>                         <chr>                        
#>  1 Luke Skywalker    blond | fair | blue           blond | fair | BLUE          
#>  2 C-3PO             <NA>                          <NA>                         
#>  3 R2-D2             <NA>                          <NA>                         
#>  4 Darth Vader       none | white | yellow         none | WHITE | YELLOW        
#>  5 Leia Organa       brown | light | brown         brown | light | brown        
#>  6 Owen Lars         brown, grey | light | blue    brown, grey | light | BLUE   
#>  7 Beru Whitesun la~ brown | light | blue          brown | light | BLUE         
#>  8 R5-D4             <NA>                          <NA>                         
#>  9 Biggs Darklighter black | light | brown         black | light | brown        
#> 10 Obi-Wan Kenobi    auburn, white | fair | blue-~ auburn, WHITE | fair | BLUE-~
#> # ... with 77 more rows

# using just one pattern (fixed)
sw %>%
  mutate(
    hair_skin_eye_repl = str_replace_all(
      string = hair_skin_eye,
      pattern = fixed("white"),
      replacement = "WHITE")
  )
#> # A tibble: 87 x 3
#>    name              hair_skin_eye                 hair_skin_eye_repl           
#>    <chr>             <chr>                         <chr>                        
#>  1 Luke Skywalker    blond | fair | blue           blond | fair | blue          
#>  2 C-3PO             <NA>                          <NA>                         
#>  3 R2-D2             <NA>                          <NA>                         
#>  4 Darth Vader       none | white | yellow         none | WHITE | yellow        
#>  5 Leia Organa       brown | light | brown         brown | light | brown        
#>  6 Owen Lars         brown, grey | light | blue    brown, grey | light | blue   
#>  7 Beru Whitesun la~ brown | light | blue          brown | light | blue         
#>  8 R5-D4             <NA>                          <NA>                         
#>  9 Biggs Darklighter black | light | brown         black | light | brown        
#> 10 Obi-Wan Kenobi    auburn, white | fair | blue-~ auburn, WHITE | fair | blue-~
#> # ... with 77 more rows

# use underlying stringi function directly
sw %>%
  mutate(
    hair_skin_eye_repl = stringi::stri_replace_all_fixed(
      str = hair_skin_eye,
      pattern = c("white", "blue", "yellow"),
      replacement = c("WHITE", "BLUE", "YELLOW"),
      vectorize_all = FALSE
    )
  )
#> # A tibble: 87 x 3
#>    name              hair_skin_eye                 hair_skin_eye_repl           
#>    <chr>             <chr>                         <chr>                        
#>  1 Luke Skywalker    blond | fair | blue           blond | fair | BLUE          
#>  2 C-3PO             <NA>                          <NA>                         
#>  3 R2-D2             <NA>                          <NA>                         
#>  4 Darth Vader       none | white | yellow         none | WHITE | YELLOW        
#>  5 Leia Organa       brown | light | brown         brown | light | brown        
#>  6 Owen Lars         brown, grey | light | blue    brown, grey | light | BLUE   
#>  7 Beru Whitesun la~ brown | light | blue          brown | light | BLUE         
#>  8 R5-D4             <NA>                          <NA>                         
#>  9 Biggs Darklighter black | light | brown         black | light | brown        
#> 10 Obi-Wan Kenobi    auburn, white | fair | blue-~ auburn, WHITE | fair | BLUE-~
#> # ... with 77 more rows

# using multiple patterns - doesn't work
sw %>%
mutate(
  hair_skin_eye_repl = stringr::str_replace_all(
    string = hair_skin_eye,
    c(
      fixed("white") = "WHITE",
      fixed("blue") = "BLUE",
      fixed("yellow") = "YELLOW"
    )
  )
)
#> Error: unexpected '=' in:
#> "      c(
#> fixed("white") ="

【问题讨论】:

    标签: r stringr


    【解决方案1】:

    您可以在str_replace_all 中传递一个命名向量:

    library(dplyr)
    library(stringr)
    
    sw %>%
      mutate(
        hair_skin_eye_repl = stringr::str_replace_all(
          string = hair_skin_eye, 
          setNames(c('WHITE', 'BLUE', 'YELLOW'), c('white', 'blue', 'yellow'))
          )
        )
    
    #   name               hair_skin_eye                    hair_skin_eye_repl              
    #   <chr>              <chr>                            <chr>                           
    # 1 Luke Skywalker     blond | fair | blue              blond | fair | BLUE             
    # 2 C-3PO              NA                               NA                              
    # 3 R2-D2              NA                               NA                              
    # 4 Darth Vader        none | white | yellow            none | WHITE | YELLOW           
    # 5 Leia Organa        brown | light | brown            brown | light | brown           
    # 6 Owen Lars          brown, grey | light | blue       brown, grey | light | BLUE      
    # 7 Beru Whitesun lars brown | light | blue             brown | light | BLUE            
    # 8 R5-D4              NA                               NA                              
    # 9 Biggs Darklighter  black | light | brown            black | light | brown           
    #10 Obi-Wan Kenobi     auburn, white | fair | blue-gray auburn, WHITE | fair | BLUE-gray
    # … with 77 more rows
    

    【讨论】:

    • 感谢您的回答。但这与我在# using default (regex) 下的reprex 中写的基本相同。这并不认为模式是固定的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多