基于R语言mtcars数据集拆分cyl变量为多列二值变量
处理mtcars数据集生成cyl对应二值变量的方法
需求:为R内置数据集mtcars的cyl变量(取值为4、6、8)生成三个二值变量cyl_4、cyl_6、cyl_8——当cyl等于对应数字时,该变量为1,否则为0,最终得到包含新变量的数据集。
现有示例数据:
mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
期望输出:
mpg cyl disp hp drat wt qsec vs am gear carb cyl_4 cyl_6 cyl_8 Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 0 1 0 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 0 1 0 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 1 0 0 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 0 1 0 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 0 0 1 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 0 1 0
方法1:基础R手动生成
直接通过逻辑判断创建新变量,无需额外包:
# 加载数据集 data(mtcars) # 生成三个二值变量 mtcars$cyl_4 <- ifelse(mtcars$cyl == 4, 1, 0) mtcars$cyl_6 <- ifelse(mtcars$cyl == 6, 1, 0) mtcars$cyl_8 <- ifelse(mtcars$cyl == 8, 1, 0) # 查看前6行结果 head(mtcars)
方法2:dplyr包批量处理
适合使用tidyverse生态的用户,代码更简洁直观:
library(dplyr) # 生成新变量并保留原数据 mtcars_new <- mtcars %>% mutate( cyl_4 = as.integer(cyl == 4), cyl_6 = as.integer(cyl == 6), cyl_8 = as.integer(cyl == 8) ) # 查看结果 head(mtcars_new)
方法3:model.matrix自动生成
如果cyl的类别较多,这种方法可以自动生成所有哑变量,无需手动逐个定义:
# 将cyl转为因子,生成无截距的哑变量矩阵 cyl_dummies <- model.matrix(~ factor(cyl) - 1, data = mtcars) # 重命名列名以匹配需求 colnames(cyl_dummies) <- paste0("cyl_", c(4, 6, 8)) # 合并哑变量到原数据集 mtcars_new <- cbind(mtcars, cyl_dummies) # 查看前6行结果 head(mtcars_new)
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

