我想同时
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") ="
您可以在
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
将整个命名向量包裹在
fixed()
中:
sw %>%
mutate(
hair_skin_eye_repl = str_replace_all(
string = hair_skin_eye,
fixed(c(
"white" = "WHITE",
"blue" = "BLUE",
"yellow" = "YELLOW"
))
)
)