2017-06-20 31 views
1

条件(一个或多个)单个列值(S),我想分别替换值c t,与c_tbo po_p。我已经通过以下方法完成了任务。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')) 
# 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 

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

回答

1

我们可以使用sub相匹配的空间(" "),在列 'B'

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”更新,

d %>% 
    mutate(b = as.character(b), 
      b = ifelse(b %in% c('c t', 'o p'), sub(" ", "_", b), b)) 
+0

我想这样做只适用于选定的值,而不是列中的所有值。 – Prradep

+0

@Prradep如果您检查输出,它会给出预期的输出。你能否改变你的例子 – akrun

+1

@Prradep如果你需要选择性的,那么'd%>%mutate(b = as.character(b),b = ifelse(b%in%c('c t','o p' ),sub(“”,“_”,b),b))' – akrun

2

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