`str_replace_all` 列中的数值根据命名向量

`str_replace_all` numeric values in column according to named vector

我想使用命名向量来映射数据框列的数值。

考虑以下示例:

df <- data.frame(year = seq(2000,2004,1), value = sample(11:15, r = T)) %>% 
    add_row(year=2005, value=1)

df
#   year value
# 1 2000    12
# 2 2001    15
# 3 2002    11
# 4 2003    12
# 5 2004    14
# 6 2005     1

我现在想按照向量替换,像这样

repl_vec <- c("1"="apple", "11"="radish", "12"="tomato", "13"="cucumber", "14"="eggplant", "15"="carrot")

我用这个

df %>% mutate(val_alph = str_replace_all(value, repl_vec))

然而,这给出了:

  #   year value     val_alph
  # 1 2000    11   appleapple
  # 2 2001    13       apple3
  # 3 2002    15       apple5
  # 4 2003    12       apple2
  # 5 2004    14       apple4
  # 6 2005     1        apple

因为 str_replace_all 使用第一个匹配项而不是整个匹配项。在真实数据中,命名向量的名称也是数字(一位和两位数)。

我希望输出是这样的:

  # year value     val_alph
  # 1 2000    11     radish
  # 2 2001    13   cucumber
  # 3 2002    15     carrot
  # 4 2003    12     tomato
  # 5 2004    14   eggplant
  # 6 2005     1      apple

有人有实现此目标的巧妙方法吗?

这是你想做的吗?

set.seed(1234)
df <- data.frame(year = seq(2000,2004,1), value = sample(11:15, r = T)) %>% 
  add_row(year=2005, value=1)

repl_vec <- c("1"="one", "11"="eleven", "12"="twelve", "13"="thirteen", "14"="fourteen", "15"="fifteen")
names(repl_vec) <- paste0("\b", names(repl_vec), "\b")

df %>%
  mutate(val_alph = str_replace_all(value, repl_vec, names(repl_vec)))

给出:

  year value val_alph
1 2000    14 fourteen
2 2001    12   twelve
3 2002    15  fifteen
4 2003    14 fourteen
5 2004    11   eleven
6 2005     1      one

我会在这里使用基数 R 的 match 而不是字符串匹配,因为您正在寻找完全匹配的整个字符串。

df %>%
 mutate(value = repl_vec[match(value, names(repl_vec))])
#>   year    value
#> 1 2000   radish
#> 2 2001   carrot
#> 3 2002   carrot
#> 4 2003 cucumber
#> 5 2004 eggplant
#> 6 2005    apple

reprex package (v2.0.1)

于 2022-04-20 创建