2017-06-20 14 views
1

における条件(複数可)に基づいて単一の列の値(複数可)を置き換える突然変異dplyr Iは、それぞれの値c tc_tでカラムbo po_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 

しかし、私はこれを達成するために、他の効率的なアプローチがあるかどうかを知りたいですか?私は選択された値に対してのみこれを行う必要がありますが、すべての値にはスペースがありません。

答えて

1

私たちは列 'B' OP」アップデートに基づいて

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 

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(%c%c( 'c t'、 'o p' )、sub( ""、 "_"、b)、b)) ' – akrun

2

dplyr::recode_と交換し、(" ")のスペースに合わせて、subを使用することができます特定の値を簡単に変更することができます:

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