如何对R语言dataframe列中指定范围的值分组生成对应因子水平
R语言实现编码列分组合并因子水平的方案
核心思路
- 优先识别带
E前缀的条目,单独归为一类 - 剩余纯数字编码提取数值后,使用
cut()函数按预设范围自动分组,无需手动匹配每个水平
实现代码
方法1:tidyverse 简便写法(推荐)
# 加载依赖包 library(dplyr) library(stringr) # 读入示例数据 df <- structure(list(gender_house_purchaser = c("Female", "Female", "Female", "Male", "Male", "Male", "Female", "Female", "Male", "Male", "Male", "Female", "Male", "Female", "Female", "Female", "Male", "Male", "Female", "Female"), house_code = c("250.83", "276", "548", "8", "197", "414", "434", "428", "428", "199", "410", "410", "572", "E57", "189", "586", "427", "277", "428", "584"), num_rooms = c(1L, 9L, 6L, 7L, 5L, 7L, 8L, 8L, 8L, 9L, 8L, 7L, 6L, 8L, 6L, 3L, 7L, 6L, 8L, 9L)), row.names = c(NA, 20L), class = "data.frame") # 分组合并因子 df <- df %>% mutate(house_code_group = case_when( str_detect(house_code, "^E") ~ "E前缀", TRUE ~ cut(as.numeric(str_remove(house_code, "[^0-9.]")), breaks = c(-Inf, 100, 200, 300, 400, 500, 600), labels = c("0-100", "101-200", "201-300", "301-400", "401-500", "501-600")) ) %>% as.factor())
运行后执行table(df$house_code_group)即可验证分组结果符合预期。
方法2:Base R 无依赖实现
# 读入示例数据 df <- structure(list(gender_house_purchaser = c("Female", "Female", "Female", "Male", "Male", "Male", "Female", "Female", "Male", "Male", "Male", "Female", "Male", "Female", "Female", "Female", "Male", "Male", "Female", "Female"), house_code = c("250.83", "276", "548", "8", "197", "414", "434", "428", "428", "199", "410", "410", "572", "E57", "189", "586", "427", "277", "428", "584"), num_rooms = c(1L, 9L, 6L, 7L, 5L, 7L, 8L, 8L, 8L, 9L, 8L, 7L, 6L, 8L, 6L, 3L, 7L, 6L, 8L, 9L)), row.names = c(NA, 20L), class = "data.frame") # 标记E前缀条目 is_E <- grepl("^E", df$house_code) # 提取纯数字编码的数值 num_val <- as.numeric(gsub("[^0-9.]", "", df$house_code)) # 定义分组标签 group_labels <- c("0-100", "101-200", "201-300", "301-400", "401-500", "501-600", "E前缀") # 生成分组因子 df$house_code_group <- factor(ifelse(is_E, "E前缀", cut(num_val, breaks = c(-Inf,100,200,300,400,500,600), labels = group_labels[1:6])), levels = group_labels)
补充说明
- 代码自动兼容带小数点的编码值(如示例中的
250.83),如果实际数据无小数,可去掉正则匹配规则里的. - 最终生成的分组列为因子类型,水平顺序和要求的规则完全一致
- 无需手动遍历修改原有因子水平,600+水平可直接批量处理
内容的提问来源于stack exchange,提问作者js2822
相关产品推荐
相关产品推荐

