`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 创建
我想使用命名向量来映射数据框列的数值。
考虑以下示例:
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 创建