Edited at

stringr::str_replace_allについてのメモ

More than 1 year has passed since last update.

ちょっとちゃんとした文章にする余裕がなかったのでメモだけ。詳しくは?stringr::str_replace_allのExampleを参照してください。

library(tidyverse)

# サンプルデータ
xlist <- c(100, 500, 1000, 2000, 5000)
n <- 20
df <- data.frame(
id = 1:n,
x = sample(xlist, n, replace = TRUE)
)

# 変換(というか生成したい)ラベルベクトル作成
xlabel <- paste("x", 1:length(xlist), sep = "_")

# 今回の場合,名前付きベクトルでは無理なのでstr_replace_allのpatternを合成して適用
# 正規表現のマッチングパターンベクトル作成
pattern <- str_c("^", xlist, "$", collapse = "|")

# xの値から対応するxのラベルをmutateする
df2 <- df %>%
mutate(label = str_replace_all(x, pattern, xlabel))
head(df2, 8)
#> id x label
#> 1 1 5000 x_1
#> 2 2 2000 x_2
#> 3 3 5000 x_3
#> 4 4 2000 x_4
#> 5 5 500 x_5
#> 6 6 2000 x_1
#> 7 7 500 x_2
#> 8 8 5000 x_3

# 名前付きベクトルはこういう時に
# nameは商品A:Eとする
xname <- paste0("商品", LETTERS[1:5])
names(xname) <- xlabel

# labelの文字列からxnameという名前付きベクトルを利用してnameという変数を生成
# 名前付きベクトルでの置換は,patternがnames,replacementがベクトルの値とする
df3 <- df2 %>%
mutate(name = str_replace_all(label, xname))
head(df3, 8)
#> id x label name
#> 1 1 5000 x_1 商品A
#> 2 2 2000 x_2 商品B
#> 3 3 5000 x_3 商品C
#> 4 4 2000 x_4 商品D
#> 5 5 500 x_5 商品E
#> 6 6 2000 x_1 商品A
#> 7 7 500 x_2 商品B
#> 8 8 5000 x_3 商品C