对 stringr::str_replace_all() 中的多个模式使用fixed()

问题描述 投票:0回答:2

我想同时

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
2个回答
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

0
投票

将整个命名向量包裹在

fixed()
中:

sw %>%
    mutate(
        hair_skin_eye_repl = str_replace_all(
            string = hair_skin_eye,
            fixed(c(
                "white" = "WHITE",
                "blue" = "BLUE",
                "yellow" = "YELLOW"
            ))
        )
    )
© www.soinside.com 2019 - 2024. All rights reserved.