如何在使用recipes包的step_dummy()函数创建哑变量时指定参考水平?
指定
step_dummy()的参考水平方法 好问题!其实step_dummy()本身并没有提供直接指定参考水平的参数,但我们可以通过提前调整因子的基准水平来达到同样的效果,比先生成全量哑变量再删除要更直接、更符合tidymodels的流水线设计思路。
核心思路
step_dummy()默认会把因子的第一个水平作为参考水平(不会生成对应的哑变量列)。所以只要我们把想要作为参考的水平调整为因子的第一个水平,再运行step_dummy()就可以直接得到以该水平为基准的哑变量。
具体实现代码
我们可以用forcats::fct_relevel()来轻松调整因子水平顺序,或者手动修改因子的levels参数:
library(tidymodels) library(forcats) # 用于便捷调整因子水平 data(okc) # 方法1:用fct_relevel指定参考水平为"vegan" recipe(Class ~ ., data = okc) %>% step_mutate(diet = fct_relevel(diet, "vegan")) %>% # 将"vegan"移到因子水平的第一个位置 step_dummy(diet) %>% prep() %>% bake(new_data = NULL) %>% select(starts_with("diet")) %>% names() #> Warning: There are new levels in a factor: NA #> [1] "diet_anything" "diet_halal" #> [3] "diet_kosher" "diet_mostly.anything" #> [5] "diet_mostly.halal" "diet_mostly.kosher" #> [7] "diet_mostly.other" "diet_mostly.vegan" #> [9] "diet_mostly.vegetarian" "diet_other" #> [11] "diet_strictly.anything" "diet_strictly.halal" #> [13] "diet_strictly.kosher" "diet_strictly.other" #> [15] "diet_strictly.vegan" "diet_strictly.vegetarian" #> [17] "diet_vegetarian"
可以看到输出里没有diet_vegan列,说明它已经被当作参考水平了,完全符合你的需求。
如果不想额外加载forcats包,也可以手动修改因子水平:
recipe(Class ~ ., data = okc) %>% step_mutate( diet = factor( diet, levels = c("vegan", setdiff(levels(diet), "vegan")) # 把"vegan"放在最前面,其余水平保持原顺序 ) ) %>% step_dummy(diet) %>% prep() %>% bake(new_data = NULL) %>% select(starts_with("diet")) %>% names()
和你原有方法的对比
这种方法比你之前“生成全量哑变量再删除参考列”的方式更高效:
- 不需要生成多余的哑变量列,减少内存占用
- 保持预处理流水线的连贯性,逻辑更清晰
- 避免后续手动删除列可能带来的错误(比如列名拼写错误)
补充说明
tidymodels的设计理念倾向于通过独立的预处理步骤来拆分功能,所以step_dummy()专注于生成哑变量,而调整因子水平的工作交给step_mutate()配合因子处理函数来完成,这样每个步骤的职责更单一,也更灵活。
内容的提问来源于stack exchange,提问作者Mark Rieke
相关产品推荐
相关产品推荐

