R
stringr

stringr::str_replace_allについてのメモ

ちょっとちゃんとした文章にする余裕がなかったのでメモだけ。詳しくは?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