You need to enable JavaScript to run this app. R语言含0连续变量分箱时单独归0为一类的实现方法(适配dplyr::mutate)
优惠活动
大模型
产品
解决方案
定价
更多

R语言含0连续变量分箱时单独归0为一类的实现方法(适配dplyr::mutate)

R 实现含0值连续变量的自定义分箱函数

自定义函数代码

该函数无需过滤原数据,基于向量位置直接赋值,完全保留原数据的索引与行顺序,可直接在dplyr::mutate()中调用:

library(dplyr)

discretize_with_zero <- function(x, non_zero_breaks = 2, right = TRUE, dig.lab = 3) {
  # 提取所有非0值
  non_zero_vals <- x[x != 0]
  # 对非0值做分箱处理
  non_zero_bins <- cut(non_zero_vals, breaks = non_zero_breaks, right = right, dig.lab = dig.lab)
  # 初始化结果因子,将0值放在分类顺序的第一位
  res <- factor(rep(NA, length(x)), levels = c("0", levels(non_zero_bins)))
  # 填充0值分类
  res[x == 0] <- "0"
  # 填充非0值的分箱结果
  res[x != 0] <- non_zero_bins
  return(res)
}

使用示例

# 导入示例数据
df <- structure(list(dummy_column = c(0, 25, 77, 423, 6, 8, 3, 65, 
32, 22, 10, 0, 8, 0, 15, 0, 10, 1, 2, 4, 5, 5, 6)), class = "data.frame", row.names = c(NA, 
-23L))

# 在mutate中直接调用函数生成分类列
df <- df %>%
  mutate(dummy_category = discretize_with_zero(dummy_column, non_zero_breaks = 2))

效果说明

示例中设置non_zero_breaks = 2,即非0值使用2个断点分成3组,加上单独的0值分类,最终得到共4个分类,查看分类结果:

# 查看分类水平
levels(df$dummy_category)
# 输出示例:"0"  "(0.577,142]" "(142,283]"  "(283,423]"

# 统计各分类数量
table(df$dummy_category)

可调参数说明

  • non_zero_breaks:非0值的分箱断点数,传入整数即可,n个断点会将非0值分成n+1组;也可直接传入自定义断点数值向量,比如c(1,10,100,500)实现自定义区间分箱
  • right:逻辑值,设置分箱区间是否为右闭合,默认TRUE,改为FALSE则为左闭右开
  • dig.lab:分箱标签的数字保留位数,默认保留3位有效数字

内容的提问来源于stack exchange,提问作者Samet Sökel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 15:36:03