【发布时间】: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") ="
【问题讨论】: