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
相关产品推荐
相关产品推荐

