如何在R语言中将数据集中的分类列转换为数值型值
R语言分类列转数值的实现方法
你可以根据自身需求选择以下几种实现方式:
- 方法1:基础R手动映射(适合需要自定义数值对应关系的场景)
这种方式可控性最高,不会因为因子默认顺序问题出现对应错误:
## 加载示例数据 library(vcd) data(Arthritis) Arthritis <- Arthritis[,2:5] ## 逐列指定映射规则 # Treatment列:Treated对应1,Placebo对应0 Arthritis$Treatment <- ifelse(Arthritis$Treatment == "Treated", 1, 0) # Sex列:Male对应1,Female对应0 Arthritis$Sex <- ifelse(Arthritis$Sex == "Male", 1, 0) # Improved列:None对应0,Some对应1,Marked对应2 Arthritis$Improved <- as.integer(Arthritis$Improved) - 1 ## 查看转换结果 head(Arthritis)
运行后输出和你给出的预期效果完全一致。
- 方法2:批量转换所有分类列(适合分类列数量多的场景)
如果所有分类列只需要按因子水平顺序转成连续数值,可以批量处理:
# 筛选出所有因子/字符类型的列 class_cols <- sapply(Arthritis, function(x) is.factor(x) | is.character(x)) # 批量转换为数值,需要从0开始的话末尾减1即可 Arthritis[class_cols] <- lapply(Arthritis[class_cols], function(x) as.integer(factor(x)))
- 方法3:dplyr语法实现(适合习惯tidyverse生态的用户)
用case_when可以更清晰的展示多条件映射规则:
library(dplyr) Arthritis <- Arthritis %>% mutate( Treatment = case_when(Treatment == "Treated" ~ 1, TRUE ~ 0), Sex = case_when(Sex == "Male" ~ 1, TRUE ~ 0), Improved = case_when( Improved == "None" ~ 0, Improved == "Some" ~ 1, Improved == "Marked" ~ 2 ) )
小提示:如果你的分类列本身是有序因子,直接调用
as.integer()就可以得到对应水平的数值,不需要额外设置映射。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

