2016-11-03 8 views
0

はここdplyr:別のケースでどのように(簡潔に)mutate条件を使用するのですか?

data <- data_frame(name = c('A','B','C','C',NA,'D')) 

> data 
# A tibble: 6 × 1 
    name 
    <chr> 
1  A 
2  B 
3  C 
4  C 
5 <NA> 
6  D 

次の例を考えてみましょう、私は変数nameが実際に'A' -> 'one''B' -> 'two'にマップすることを知っています。私は単にマッピング値を取得する変数を作成したいと思います。もちろん、私の元のデータセットには、さらに多くのケースがあります。

はありませんの作業は次のとおりです。

data <- data %>% 
    mutate(mapping = ifelse(name == 'A', 'one', name), 
     mapping = ifelse(name == 'B', 'two', name)) 
> data 
# A tibble: 6 × 2 
    name mapping 
    <chr> <chr> 
1  A  A 
2  B  two 
3  C  C 
4  C  C 
5 <NA> <NA> 
6  D  D 

ここで何が間違っていますか? dplyrでこれを行う最も効率的な方法は何ですか?

多くの感謝!

+3

ifelse式はifelse(name == 'A'、 'one'、name)でなければならないと思います。現時点では、ifelseはあなたのデータフレーム内の変数という名前のマッピングを探していますが、それはまだ存在しません。 – gfgm

+0

ありがとうございますが、それでも正しく動作しません。 –

+1

すべてのマッピング値をハードコードする必要がある場合は、ifelseステートメントをネストすることができます。 ifelse(name == 'A'、 'one'、ifelse(name == 'B'、 'two'、....)) – Craig

答えて

8

ネストされたifelseを避けたい場合は、マッピングデータフレームを作成し、内部結合を行うだけです。

mapping_df <- data.frame(name = c('A', 'B', 'C' . . . . 'Z'), mapping = c(1:26)) 

left_join(data, mapping_df, by = "name") 
+0

非常にスマートです。残念なことに、そのためのすぐれた 'dplyr'ソリューションはありませんが、これは実際にはより良いかもしれません –

1

二つの値について、あなたのような何かを試みることができる:あなたがマップが含まれて別のデータフレームを作成したほうが良いし、それを追加するdplyr :: left_joinを()を使用してだろうが

data <- data %>% 
    mutate(mapping = ifelse(name == 'A', 'one', 
    ifelse(name == 'B', 'two', 'other'))) 

あなたのメインdfに

0
data %>% mutate(mapping = recode(name, A="one", B="two")) 

置換えがあまり多くない場合は、便利です。

関連する問題