R语言中基于字符串变量创建虚拟变量的实现方法
R语言分类列转虚拟变量实现方案
首先提个前置注意点:你初始用cbind(people, colors)生成的对象是字符型矩阵,不是标准数据框,所有操作前建议先转成data.frame,避免后续出现类型异常。
方法1:基础R原生实现(零依赖)
不用安装任何第三方包,直接用内置的model.matrix函数生成虚拟变量即可,代码如下:
# 转换为标准数据框 df <- as.data.frame(cbind(people, colors), stringsAsFactors = FALSE) # 生成无截距项的虚拟变量矩阵 dummy_vars <- model.matrix(~ colors - 1, data = df) # 清理列名,去掉自动生成的"colors"前缀 colnames(dummy_vars) <- sub("^colors", "", colnames(dummy_vars)) # 拼接原people列得到最终结果 df_dummies <- cbind(people = df$people, as.data.frame(dummy_vars))
运行结果和你手动构造的示例完全一致,每个分类列的取值为0/1,对应行是否属于该分类。
方法2:tidyverse 生态实现(适配日常数据清洗流程)
如果你平时用dplyr/tidyr做数据处理,可以用宽表转换的逻辑生成虚拟变量,不需要手动调整列名:
library(dplyr) library(tidyr) df_dummies <- df |> as.data.frame(stringsAsFactors = FALSE) |> mutate(flag = 1) |> pivot_wider( names_from = colors, values_from = flag, values_fill = 0 )
这个写法会自动把colors列的所有唯一值作为新列名,没有对应分类的行自动填充0,代码可读性很高。
方法3:fastDummies 包实现(适合大数据量场景)
如果你的数据集行数很高,追求运行效率,可以用专门做虚拟变量生成的fastDummies包,一行代码完成全流程:
# 首次使用请先运行安装:install.packages("fastDummies") library(fastDummies) df_dummies <- df |> as.data.frame(stringsAsFactors = FALSE) |> dummy_cols( select_columns = "colors", remove_selected_columns = TRUE )
这个方法运行速度远快于前两种,百万行级数据也能秒出结果,生成的列名规范,不需要额外清理。
以上三种方法都可以自动适配colors列的所有分类取值,哪怕后续新增其他颜色分类,也不需要修改代码,比手动给每个颜色写向量赋值的方式通用性强很多。
内容的提问来源于stack exchange,提问作者Gabriel Voelcker
相关产品推荐
相关产品推荐

