为何R中ifelse语句会将因子转换为数值?附dplyr实操问题
问题原因与解决方法
原因
base::ifelse()函数会自动统一输出值的类型:当你把因子类型的cut作为分支返回值时,因子会被强制转换为其底层的整数编码(原cut因子中Fair对应1、Good对应2,以此类推);而新字符串"Not Fair at All"是字符类型,最终整个cut.fix列会被转为字符类型,所以原因子的非Fair水平就显示成了整数数值。
解决方案
推荐两种实用的解决方式:
方法1:用dplyr::if_else()替代基础版ifelse()
dplyr的if_else()会严格匹配分支返回值的类型,且能保留因子属性,需要先把新水平加入原因子的水平列表:
diamonds %>% mutate(cut.fix = if_else( cut == "Fair", factor("Not Fair at All", levels = c("Not Fair at All", levels(cut)[-1])), cut )) %>% select(cut.fix) %>% table()
方法2:用forcats包的fct_recode()(更简洁)
forcats是专门处理因子的工具包,fct_recode()可以直接修改因子水平,完全避免类型转换问题:
library(forcats) diamonds %>% mutate(cut.fix = fct_recode(cut, "Not Fair at All" = "Fair")) %>% select(cut.fix) %>% table()
执行后会得到正确的统计结果:
cut.fix Not Fair at All Good Very Good Premium Ideal 1610 4906 12082 13791 21551
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

