dplyr mutate以有效的方式基于条件替换单个列中的值

时间:2017-06-20 14:53:03

标签: r dplyr

我想分别用c to p替换b列的值c_to_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

但是,我想知道是否有其他有效的方法来实现这一目标?我只需要为选定的值执行此操作,但不是所有具有空格的值。

2 个答案:

答案 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) )