我试图使用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元素似乎是问题。
非常感谢!
答案 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)