为什么我的因子水平转向dplyr :: mutate()的数字?

时间:2017-06-23 20:02:06

标签: r dplyr mutate

我试图使用dplyr :: mutate()重新编码一些因子级别,以便所有" MOT"和" CHI"因子水平保持原样,所有其他因素转向" OTH"。

我的数据如下:

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")) 

但是,当我运行此脚本时,某些级别会转换为&#34; OTH&#34;但所有其他人都改变了数字。无论我是否包含因子(扬声器)命令,都会发生这种情况:

subj | speaker | word

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

正在将因素改变为&#34; OTH&#34;好吧,但我的ifelse代码的TRUE元素似乎是问题。

非常感谢!

3 个答案:

答案 0 :(得分:1)

另外,您也可以使用此解决方案。这是生成因子水平中存在的值的索引。

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

因此,要捕捉实际价值,我们可以使用级别(发言人)[发言人]

答案 1 :(得分:0)

为什么我不确定,但是如果您阅读了因素的帮助菜单:?因为它提到首先转换为as.character。

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

答案 2 :(得分:0)

要更改因子级别而不是字符列中的值,您需要直接使用因子的级别。您可以通过使用levels函数或使用来自RStudio的fct_other包中的forcats函数在基数R中执行此操作。在这两种方法中,speaker中的new.df是具有所需级别的因素。

这些方法如下所示:

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)