我得到了两个因素
foo_1 <- factor(c("a", "b", "c", "Other"))
foo_2 <- factor(c("a", "b", "x"))
我想重新编码foo_2
,这样
- 水平与
foo_1
相同 - 不存在于
levels(foo_2)
("x"
(中的电平被重新编码为"Other"
-电平
所以,类似的东西
bar(foo_2, foo_1)
[1] a b Other
Levels: a b c Other
背景
我正在构建randomForest()
s,预测数据中可能存在开发数据中不存在的级别,并且预测是不可能的,这非常令人讨厌。(foo_1
是来自发展数据的矢量,foo_2
是来自预测数据的矢量。(我敢打赌,其他人以前一定也遇到过同样的问题,答案应该在那里,但我找不到。
我很喜欢使用forcats
包的解决方案,但也非常欢迎其他方式。
提前谢谢。
下面的东西怎么样
> replace(u <- foo_1[match(levels(foo_2),levels(foo_1))],is.na(u),"Other")
[1] a b Other
Levels: a b c Other
一个简单的方法是:
foo_3 <- factor(foo_2, levels = levels(foo_1))
foo_3[is.na(foo_3)] <- 'Other'
foo_3
#[1] a b Other
#Levels: a b c Other
在forcats
中,我可以找到fct_other
,它确实做到了这一点,但它没有保留缺失的能级。(c
(,所以您必须稍后添加它。
library(forcats)
foo_3 <- fct_other(foo_2, levels(foo_1))
foo_3 <- fct_expand(foo_3, levels(foo_1))
扩展Ronaks答案,并使用magrittr
管道(%>%
(使其更加优雅:
library (forcats)
foo_2 %>% fct_expand(levels(foo_1)) %>% fct_other(levels(foo_1))
[1] a b Other
Levels: a b c Other