如何在R语言tidyverse中对tibble的分类变量进行哑变量编码
如何在tidyverse中对因子变量进行哑变量编码
看起来你想要把包含分类因子的tibble转换成哑变量(0/1)格式,最终得到10行8列的数据集——这在统计建模或者机器学习预处理里很常见,我来给你两种基于tidyverse的实现方法,都能满足你的需求:
首先,先重现你的数据集(我加了set.seed()让结果可重复,方便你验证):
library(tidyverse) set.seed(123) # 确保随机采样结果一致 tib <- as.tibble(list( record = c(1:10), gender = as.factor(sample(c("M", "F"), 10, replace = TRUE)), like_product = as.factor(sample(1:5, 10, replace = TRUE)) ))
方法1:用model.matrix快速生成(推荐)
model.matrix是R中生成哑变量的经典工具,结合tidyverse的管道可以一步到位,而且会自动处理因子类型的变量:
dummy_tib <- tib %>% model.matrix(~ . - 1, data = .) %>% # ~ . 表示用所有变量,-1 表示不生成截距项(保留所有水平的哑变量) as.tibble() %>% # 可选:去掉变量名里的前缀(比如把genderM改成M) rename_with(~ str_remove(., "^gender|^like_product"))
运行后你会得到10行8列的tibble:record + 2个gender哑变量(F/M) + 5个like_product哑变量(1-5),完全符合你的要求。
方法2:用tidyr::pivot_wider手动实现(更直观)
如果你想更清楚地看到哑变量生成的过程,可以用pivot_wider分步处理每个分类变量:
dummy_tib <- tib %>% # 处理gender的哑变量:每行对应一个gender水平,填充1,其他为0 mutate(gender_flag = 1) %>% pivot_wider(names_from = gender, values_from = gender_flag, values_fill = 0) %>% # 处理like_product的哑变量,逻辑和上面一致 mutate(product_flag = 1) %>% pivot_wider(names_from = like_product, values_from = product_flag, values_fill = 0)
这个方法的好处是每一步都很透明,你可以随时检查中间结果,适合刚接触tidyverse的用户。
验证一下最终结果的结构:
dummy_tib # A tibble: 10 × 8 record F M `1` `2` `3` `4` `5` <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 1 0 0 1 0 0 0 2 2 0 1 1 0 0 0 0 3 3 0 1 0 1 0 0 0 4 4 1 0 0 0 1 0 0 5 5 1 0 0 0 0 1 0 6 6 0 1 0 1 0 0 0 7 7 1 0 0 0 0 1 0 8 8 0 1 0 0 0 1 0 9 9 1 0 0 0 0 1 0 10 10 0 1 0 0 0 0 1
两种方法都能达到你想要的效果,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Jacob Nelson
相关产品推荐
相关产品推荐

