You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:36:08