我想分别用c t
,o p
替换b
列的值c_t
,o_p
。我使用以下方法完成了任务。
d <- data.frame(a = c(5,6,3,7,4,3,8,3,2,7),
b = c('c t','c_t','d','o p','o_p','c m','c_t','d','o t','o_p'))
# Way-1
d %>%
mutate(b = replace(b, b == 'c t', 'c_t')) %>%
mutate(b = replace(b, b == 'o p', 'o_p'))
# Way-2
d %>% mutate(b = replace(b, b == 'c t', 'c_t'),
b = replace(b, b == 'o p', 'o_p'))
输出:
# a b
# 1 5 c_t
# 2 6 c_t
# 3 3 d
# 4 7 o_p
# 5 4 o_p
# 6 3 c m
# 7 8 c_t
# 8 3 d
# 9 2 o t
# 10 7 o_p
但是,我想知道是否有其他有效的方法来实现这一目标?我只需要为选定的值执行此操作,但不是所有具有空格的值。
答案 0 :(得分:4)
dplyr::recode
是更改特定值的快捷方式:
library(dplyr)
d <- data.frame(a = c(5,6,3,7,4,3,8,3,2,7),
b = c('c t','c_t','d','o p','o_p','c m','c_t','d','o t','o_p'))
d %>% mutate(b = recode(b, 'c t' = 'c_t', 'o p' = 'o_p'))
#> a b
#> 1 5 c_t
#> 2 6 c_t
#> 3 3 d
#> 4 7 o_p
#> 5 4 o_p
#> 6 3 c m
#> 7 8 c_t
#> 8 3 d
#> 9 2 o t
#> 10 7 o_p
答案 1 :(得分:2)
我们可以使用sub
来匹配空格(" "
),将其替换为&#39; b&#39;
_
d %>%
mutate(b = sub(" ", "_", b))
# a b
#1 5 c_t
#2 6 c_t
#3 3 d
#4 7 o_p
#5 4 o_p
#6 3 c_t
#7 8 c_t
#8 3 d
#9 2 o_p
#10 7 o_p
基于OP&#39;更新,
d %>%
mutate(b = as.character(b),
b = ifelse(b %in% c('c t', 'o p'), sub(" ", "_", b), b) )