2017-06-23 14 views
1

私はdplyr :: mutate()を使っていくつかの因子レベルをコード化しようとしていますので、すべての "MOT"と "CHI"因子レベルはそのままで、他はすべて "OTH"に変わります。なぜ私の因子レベルはdplyr :: mutate()で数値に変わりますか?

私のデータは次のようになります。

subj | speaker | word 

1  MOT  apple 
1  CHI  baby 
1  SI1  baby 
2  CHI  dog 
2  CHI  cat 
2  FAT  cat 

そして、私はこのようなルックスにそれをしたい:

subj | speaker | word 

1  MOT  apple 
1  CHI  baby 
1  OTH  baby 
2  CHI  dog 
2  CHI  cat 
2  OTH  cat 

私のコードは次のようになりますときに私、しかし

new.df <- data %>% 
    dplyr::select(subj, speaker) %>% 
     mutate(speaker = factor(speaker), 
     speaker = ifelse(speaker %in% c("CHI", "MOT"), speaker, "OTH")) 

このスクリプトを実行すると、いくつかのレベルが "OTH"に変換されますが、他のすべては数値に変わります。これは関係なく、私が因子(スピーカー)コマンドが含まれるかどうかに起こる:

subj | speaker | word 

1  175  apple 
1  86  baby 
1  OTH  baby 
2  86  dog 
2  86  cat 
2  OTH  cat 

それは要因を変更していると「OTH」OK私ifelseコードのTRUE要素が問題であるように思われます。

多くの感謝!

+1

あなたはifelseためにあなたの2番目の引数としてas.character(スピーカー)をお勧めします。 R因子は実際には整数です。話し手が性格を持っていたなら、ifelse操作の前に来る要因呼び出しで足で自分を撃っていました。それは後に意味をなさないかもしれない。 –

+0

それは働いた!本当にありがとう!しかし、私はas.factor()コマンドを省略するとRが私に、スピーカーはすでに文字ベクトルであると私に伝えます。 –

+0

Rの因子は整数です。因子の作成時に名前を付けることができる整数です。 –

答えて

0

なぜ私は正確にはわかりませんが、factor:?factorのヘルプメニューを読んだ場合、最初にas.characterに変換されています。

new.df <- data %>% 
dplyr::select(subj, speaker) %>% 
    mutate(speaker = factor(speaker), 
    speaker = ifelse(speaker %in% c("CHI", "MOT"), as.character(speaker), "OTH")) 
1

また、この解決方法も要因のために使用できます。これは、因子のレベルに存在する値の指標を生成しています。

new.df <- df %>% 
select(subj, speaker) %>% 
    mutate(speaker = ifelse(speaker %in% c("CHI", "MOT"), levels(speaker) 
[speaker], "OTH")) 

だから我々は、要因のレベルではなく、文字列の値を変更するにはレベル(スピーカーに)[スピーカー]

0

を使用することができ、実際の値をキャプチャするために、あなたが直接操作する必要があります因子のレベル。これは、levels関数を使用するか、RStudioのforcatsパッケージのfct_other関数を使用して、基底Rで実行できます。いずれの方法においても、new.dfspeakerは必要なレベルの因子である。

、これらの方法は以下の通りである:

data <- data.frame(subj=c(1,1,1,2,2,2), speaker=c("MOT","CHI","SI1","CHI","CHI","FAT"), word=c("apply","baby","baby","dog","cat", "cat")) 
# 
# To reset selected levels in base R 
# 
    new.df <- data 
    new.df$speaker <- factor(new.df$speaker) 
    levels(new.df$speaker)[!levels(new.df$speaker) %in% c("CHI", "MOT")] <- "OTH" 
# 
# To reset using forcats package from the RStudio suite 
# 
    library(dplyr) 
    library(forcats) 
    new.df <- data %>% mutate(speaker = fct_other(speaker, keep=c("CHI","MOT"), 
               other_level = "OTH")) 
    # 
    # Note that speaker in new.df is a factor with the new levels 
    # 
    str(new.df) 
+0

これは本当に役に立ちます - ありがとう! –

関連する問題